On Mar 1, 2010, at 2:32 PM, ik wrote:


http://ik.homelinux.org/


On Mon, Mar 1, 2010 at 23:20, Jerry <lancebo...@qwest.net> wrote:
Don't compare floating points. Ever. Now you see why.

So if I need for example to compare currency or something that is floating point, how do I do that ?


Also, don't write loops that calculate a floating point number which is then tested for equality to exit the loop. Also, it is a bad idea to test for > or < for exiting unless you know in advance an accidental equality result will not yield surprising results. In other other words, don't do that (test for > or <) either.

As I understand, there is an old way to calculate floating point that is very popular and newer ways for that. The old way uses binary calculation and the newer I do not understand them :)

The older way that you are thinking of might be binary coded decimal, BCD, in which each decimal digit is represented by its own bit string, usually four bits, to represent the digits 0–9. It is rarely used any more. I'm not sure but maybe Hewlett-Packard calculators use BCD. (HP calculators are known for their excellent numerical accuracy. The academic who did a lot of their work was also involved in the IEEE 754 standard, I think.)

The newer way that you are thinking of is probably IEEE 754 floating point which is implemented widely on modern microprocessors. Its whole numbers (1.0, 2.0, etc.) are supposedly exact equivalents to integer counterparts up to a very large number, but you had _really_ better know what you are doing if you depend on that for comparisons. And expect portability problems when moving to non-IEEE 754 platforms.

BTW, the way to write a loop that increments a floating point number properly is this (Please pardon if any Ada syntax slips in here):

for i := 0 .. 100 begin
        a_float := 1.23 * i;
end;


whereas this is a bad idea:

a := 0.0;
while a <= 100.0 do
        a_float := 1.23 * i;
        a := a + 1.0;
end;


as is this:


a := 0.0;
while a <= 123.0 do
        a := a + 1.23;
end;

Jerry



Jerry

On Feb 26, 2010, at 3:37 AM, ik wrote:

Hello,

I've made a small test:

if (0.1+0.2) = 0.3 then

The only compiler/interpator that actually tells that it equal is FPC.

I've tested it using Javascript (in Firefox), Ruby, Python, C (gcc) and Perl.

Except FPC, everyone tells that 0.1+0.2 = 0.30000000000000004

Can someone explain how FPC see the result and why others does not see it like that ?


Thanks,
Ido

http://ik.homelinux.org/
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal


Ido
_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/mailman/listinfo/fpc-pascal

Reply via email to