in reply to int() function
It prints "Number is: 196, Integer part is: 195", but I would expect $x2 to be 196
Your expectation is unreasonable. (I know ... it seems like a reasonable expectation ... but it is not.)
First of all, note that (1.15*170)+0.50 cannot be exactly represented in a double.
This is mainly due to the fact that 1.15 cannot be exactly represented in a double.
When you assign a value of 1.15 to a double you are actually assigning the precise value 1.149999999999999911182158029987476766109466552734375.
And the expression (1.15*150)+0.50 evaluates to exactly 195.999999999999971578290569595992565155029296875.
Perl's print() function takes the action of rounding that value to 15 decimal digits. It does that for all floating point values - always to 15 decimal digits (unless perl's nvtype is other than "double") and always for a dubious reason.
So ... quite clearly, the integer portion of 195.999999999999971578290569595992565155029296875 is 195, and 195.999999999999971578290569595992565155029296875 rounded to 15 decimal places is 196.
And this agrees with the results that you obtained.
It leaves shaking my head in disbelief, too ... but that's the stupid way that perl's print() function has been doing it for a long time and, unfortunately, I can't see it doing anything differently any time soon.
A far saner approach would be for perl's print() function to have displayed the value 195.99999999999997 as happens with python3 and raku.
Note that, although you have questioned the printed value of $x2, it's actually the printed value of $x1 that's misleading.
Cheers,
Rob
Your expectation is unreasonable. (I know ... it seems like a reasonable expectation ... but it is not.)
First of all, note that (1.15*170)+0.50 cannot be exactly represented in a double.
This is mainly due to the fact that 1.15 cannot be exactly represented in a double.
When you assign a value of 1.15 to a double you are actually assigning the precise value 1.149999999999999911182158029987476766109466552734375.
And the expression (1.15*150)+0.50 evaluates to exactly 195.999999999999971578290569595992565155029296875.
Perl's print() function takes the action of rounding that value to 15 decimal digits. It does that for all floating point values - always to 15 decimal digits (unless perl's nvtype is other than "double") and always for a dubious reason.
So ... quite clearly, the integer portion of 195.999999999999971578290569595992565155029296875 is 195, and 195.999999999999971578290569595992565155029296875 rounded to 15 decimal places is 196.
And this agrees with the results that you obtained.
It leaves shaking my head in disbelief, too ... but that's the stupid way that perl's print() function has been doing it for a long time and, unfortunately, I can't see it doing anything differently any time soon.
A far saner approach would be for perl's print() function to have displayed the value 195.99999999999997 as happens with python3 and raku.
Note that, although you have questioned the printed value of $x2, it's actually the printed value of $x1 that's misleading.
Cheers,
Rob
|
---|
Replies are listed 'Best First'. | |
---|---|
Re^2: int() function
by tobyink (Canon) on Oct 24, 2020 at 20:04 UTC | |
by LanX (Saint) on Oct 24, 2020 at 20:36 UTC | |
Re^2: int() function
by LanX (Saint) on Oct 24, 2020 at 16:05 UTC | |
by syphilis (Archbishop) on Oct 25, 2020 at 00:46 UTC | |
by LanX (Saint) on Oct 25, 2020 at 12:09 UTC | |
by syphilis (Archbishop) on Oct 25, 2020 at 13:05 UTC | |
by LanX (Saint) on Oct 25, 2020 at 18:21 UTC | |
| |
by ikegami (Patriarch) on Oct 30, 2020 at 12:11 UTC | |
Re^2: int() function
by geoperl (Novice) on Oct 24, 2020 at 22:28 UTC | |
by LanX (Saint) on Oct 24, 2020 at 23:25 UTC | |
by geoperl (Novice) on Oct 25, 2020 at 19:08 UTC |
In Section
Seekers of Perl Wisdom