Thanks thanks for your report.
I do not have the answer but this is important to get aware of that.

Stef

On Feb 27, 2011, at 10:08 PM, t olschewski wrote:

> Hi, using formatted number output recently I got the following output:
> 
> 1.0 printPaddedWith: $0 to: 2.1. "'01.0'"
> 1.0 printPaddedWith: $0 to: 2.2. "'01.00'"
> 1.0 printPaddedWith: $0 to: 2.3. "'01.00'"    <-- wrong
> 1.0 printPaddedWith: $0 to: 2.4. "'01.000'"   <-- wrong
> 1.0 printPaddedWith: $0 to: 2.5. "'01.00000'"
> 
> running Float>>printPaddedWith:to: in the debugger showed me that the reason
> of this odd behaviour seems to be produced by Float>>truncated and/or
> Float>>fractionPart.  I can provoke errors of that kind even easier:
> 
> (2.3 fractionPart * 10) truncated. => "2" (instead of 3)
> 
> In Primitive 51 (primitiveTruncated for Float>>truncated) I read
> 
> frac = modf(rcvr, &trunc);
> 
> so the problem looks like an issue with rounding errors in Math-Library's
> modf
> function.
> 
> Indeed, I can reproduce the odd result of "(2.3 fractionPart * 10)
> truncated."
> in C++ using modf:
> 
> // g++ -lm truncate.cpp && ./a.out
> #include<iostream>
> #include<cmath>
> using namespace std;
> int main(){
>  double f1, f2, f3;
>  modf(10 * 0.3, &f1);
>  cout << f1 << endl;
>  modf(10 * modf(2.3, &f2), &f3);
>  cout << f3 << endl;
> }
> // output:
> // 3 (ok)
> // 2 (error - should be 3)
> 
> Question: what can be done about this?
> 
> As a matter of fact, several important methods spread over a number of
> classes
> (Float, Number, Morph ... being among them) are senders of Float>>truncated
> or
> Float>>fractionPart, so rounding errors in primitive 51 or 52 could provoke
> unexpected behaviour in surprising places.
> 
> 
> -- 
> View this message in context: 
> http://forum.world.st/rounding-errors-tp3327130p3327130.html
> Sent from the Pharo Smalltalk Users mailing list archive at Nabble.com.
> 


Reply via email to