Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.c > #29218

Re: sscanf question

From glen herrmannsfeldt <gah@ugcs.caltech.edu>
Newsgroups comp.lang.c
Subject Re: sscanf question
Date 2012-12-14 03:25 +0000
Organization Aioe.org NNTP Server
Message-ID <kae67t$isr$1@speranza.aioe.org> (permalink)
References (3 earlier) <74e828e9-5f56-491d-b010-a5dd0cb4bd13@googlegroups.com> <4be7ce8b-cc02-44e5-8824-246b832fd21f@googlegroups.com> <p_sys.509618$Wc4.426891@fx10.am4> <lnmwxhldo9.fsf@nuthaus.mib.org> <hfwys.1119952$Ol2.766606@fx25.am4>

Show all headers | View raw


BartC <bc@freeuk.com> wrote:
 
> "Keith Thompson" <kst-u@mib.org> wrote in message

(snip)
>> Floating-point can't exactly represent all integer values within its
>> range
 
> 64-bit floats can still represent some $45 trillion dollars, even if you
> work in cents. Anything more than that, then perhaps you should make use of
> some 'serious' methods. But we're talking about the price of coffee.
 
>> -- and operations that yield inexact results generally don't give
>> any warning about a loss of precision.
 
> Integers aren't much better, when division is introduced. And division is
> necessary to do things like percentages. Unless the proposal is not only to
> use integers, but to use rationals so that you never get to do the division
> (but I'd be interested in how you'd print out the results!).

Integers are still a lot better.
 
>> But then why use floating-point rather a large integer type in the first
>> place?
 
> Because integers don't do fractions very well. Not without using special
> methods, at which point it becomes easier to just use floating point.
 
> If you *know* that intermediate results need to be rounded to the nearest
> cent, for example, then you just round to the nearest cent (ie. to the
> nearest whole number). As far as add, subtract and multiply are concerned,
> calculating using floating point whole numbers is little different to using
> integers. But if you then have to calculate 15.9% tax on $53.49, it's a lot
> easier with floating point.

Take 5349 (cents) multiply by 159 and then divide by 1000 to get the
truncated tax in cents. But with tax, you have to watch the rounding.
If you want the rounded value, add 500 before dividing by 1000.

Some years ago I lived in Maryland, where, as far as I could tell, the
tax was rounded up. You can add from 0 to 999 before dividing depending
on how you want it rounded. You do have to be sure that the intemediate
doesn't overflow, but with 64 bit integers that shouldn't be hard.

With floating point, the intermediate values might be rounded. You then
have to be careful to avoid double rounding, which can give an 
unexpected wrong result. 

With integer division, you control the rounding.
 
> (I've done this stuff where the total needed to be calculated in two
> separate currencies. The conversion rate between them was specified to four
> decimal places. Or you're buying by weight or length, and need to use either
> metric or Imperial measure. These things just aren't integer-friendly!)

Multiply be the value with four decimal places, after moving the decimal
point to the right four places, then divide by 10000. Not hard at all.
Again, add the appropriate amount before dividing to round as needed.

-- glen

Back to comp.lang.c | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread


Thread

sscanf question "Brian O'Brien" <bjobrien62@gmail.com> - 2012-12-12 13:29 -0800
  Re: sscanf question "BartC" <bc@freeuk.com> - 2012-12-12 21:43 +0000
  Re: sscanf question James Kuyper <jameskuyper@verizon.net> - 2012-12-12 16:52 -0500
  Re: sscanf question Les Cargill <lcargill99@comcast.com> - 2012-12-12 22:14 -0600
    Re: sscanf question Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-12-13 14:03 +0000
  Re: sscanf question falk@rahul.net (Edward A. Falk) - 2012-12-13 20:36 +0000
    Re: sscanf question Prathamesh Kulkarni <bilbotheelffriend@gmail.com> - 2012-12-13 13:40 -0800
      Re: sscanf question Fred K <fred.l.kleinschmidt@gmail.com> - 2012-12-13 14:31 -0800
        Re: sscanf question Fred K <fred.l.kleinschmidt@gmail.com> - 2012-12-13 14:33 -0800
          Re: sscanf question "BartC" <bc@freeuk.com> - 2012-12-13 22:51 +0000
            Re: sscanf question Keith Thompson <kst-u@mib.org> - 2012-12-13 15:45 -0800
              Re: sscanf question glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2012-12-14 00:06 +0000
              Re: sscanf question "BartC" <bc@freeuk.com> - 2012-12-14 02:33 +0000
                Re: sscanf question glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2012-12-14 03:25 +0000
                Re: sscanf question "BartC" <bc@freeuk.com> - 2012-12-14 11:50 +0000
                Re: sscanf question glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2012-12-14 12:19 +0000
                Re: sscanf question "BartC" <bc@freeuk.com> - 2012-12-14 13:38 +0000
                Re: sscanf question glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2012-12-14 20:40 +0000
                Re: sscanf question Nick Keighley <nick_keighley_nospam@hotmail.com> - 2012-12-16 03:34 -0800
          Re: sscanf question falk@rahul.net (Edward A. Falk) - 2012-12-15 03:28 +0000
            Re: sscanf question Les Cargill <lcargill99@comcast.com> - 2012-12-14 22:41 -0600
              Re: sscanf question Keith Thompson <kst-u@mib.org> - 2012-12-15 01:25 -0800
                Re: sscanf question glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2012-12-15 10:26 +0000
                Re: sscanf question Les Cargill <lcargill99@comcast.com> - 2012-12-15 13:24 -0600
                Re: sscanf question glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2012-12-15 20:15 +0000
                Re: sscanf question Les Cargill <lcargill99@comcast.com> - 2012-12-15 15:33 -0600
                [OT] Re: sscanf question Eric Sosman <esosman@comcast-dot-net.invalid> - 2012-12-15 17:49 -0500
                Re: [OT] Re: sscanf question glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2012-12-16 00:16 +0000
            Re: sscanf question Barry Schwarz <schwarzb@dqel.com> - 2012-12-14 21:28 -0800
            Re: sscanf question glen herrmannsfeldt <gah@ugcs.caltech.edu> - 2012-12-15 08:17 +0000
      Re: sscanf question Eric Sosman <esosman@comcast-dot-net.invalid> - 2012-12-13 18:22 -0500
  Re: sscanf question "Brian O'Brien" <bjobrien62@gmail.com> - 2012-12-13 21:13 -0800
    Re: sscanf question Ben Bacarisse <ben.usenet@bsb.me.uk> - 2012-12-14 12:25 +0000

csiph-web