Take the 2-minute tour ×
Programmers Stack Exchange is a question and answer site for professional programmers interested in conceptual questions about software development. It's 100% free, no registration required.

Say you have a situation where you divide and then multiply a float, and you need to guarantee that it survives macheps (ie multiplication output equals division input). What are known strategies for guaranteeing this? Rounding would work, but anything else?

share|improve this question
3  
Use a different type that represents numbers as fractions. Then you can represent all rational numbers exactly. –  CodesInChaos Mar 17 '13 at 12:03
add comment

3 Answers 3

Traditionally, you multiply FIRST, and THEN you divide.

If your hardware and compiler are smart enough, the instructions emitted will preserve the full double-width result of the multiplication, for processing by the division.

Dividing first and then multiplying, you can't really do that. (Your compiler MIGHT at that point be smart enough to reorder the operations, but you are usually safer doing it yourself.)

Read Hamming's Numerical Methods for Scientists and Engineers. Early in the book, he goes into considerable detail on reorganizing your computations to reduce this kind of trouble. It's available from Dover. (If technical literature is your fetish, like it is mine, Dover is your FRIEND!)

share|improve this answer
add comment

Actually this error happens not only because of multiplication, it can be reproduced by a simplier way: 0.1 + 0.2

There is a special website for this issue: http://floating-point-gui.de/

What can I do to avoid this problem?

That depends on what kind of calculations you’re doing.

  • If you really need your results to add up exactly, especially when you work with money: use a special decimal datatype.
  • If you just don’t want to see all those extra decimal places: simply format your result rounded to a fixed number of decimal places when displaying it.
  • If you have no decimal datatype available, an alternative is to work with integers, e.g. do money calculations entirely in cents. But this is more work and has some drawbacks.
share|improve this answer
add comment

You can't guarantee that. Not while using floats, anyway. As the comment says, if you need a guarantee, you can use arbitrary-precision fractions.

In general, rounding doesn't offer such a guarantee, either -- you need to do some actual math before you can be confident it works within the range of your particular application.

The real question is: why do you think you need a guarantee? Your question suggests that you need to actually, seriously devote some effort to considering this, because its answer is likely the most relevant and important part of actually solving your problem, and you have not provided enough information to enable any more detailed constructive advice.

share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.