Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
| 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> |
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
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