Thanks david.

Stef

On Feb 28, 2011, at 4:09 AM, David T. Lewis wrote:

> Good catch!
> 
> It looks to me like the root cause is that the argument 2.3 is being
> treated as a floating point value, whereas in this context it is really
> intended as a format specifier (i.e. a string, such as you might use
> in a sprintf() function).
> 
> I wrote a test to document this bug, and added the fix to Squeak trunk.
> The test and the modified #printPaddedWith:to: method are in the attached
> change set.
> 
> Dave
> 
>> 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.
> <Float-printPaddedWith-dtl.1.cs>


Reply via email to