Hi Abu,

 I got the idea for my variation on your script from a forum, where
someone is parsing a list of numbers in scientific notation just as
you are.

http://www.gamedev.net/community/forums/topic.asp?topic_id=537620&whichpage=1&#3470722

Until the bug is fixed, here's a workaround:

---

#!/usr/bin/perl

use strict;
use warnings;

my $d1 = parse_sci_note('6.892964e-309');
my $d2 = parse_sci_note('1.102874e-307');

my $sum = $d1 + $d2;

printf("d1 = %e\n", $d1);
printf("d2 = %e\n", $d2);
printf("sum = %e\n", $sum);

sub parse_sci_note {
# argumnet must be a string to work around perl bug
    my $arg = shift;
    $arg =~ s/[eE]/\*10\*\*/;
    return eval($arg);
}

---

The perl documentation clearly shows scientific notation used here:

http://perldoc.perl.org/perldata.html#Scalar-value-constructors

so I'd say it definitely is a bug.

On Tue, Sep 21, 2010 at 10:25 AM, Abu Yoav <abuy...@gmail.com> wrote:
> Hi Jon and Shlomi,
>
> Thanks!
>
> Jon:
> Actually, in my case, it's a bit more complicated than that. I read the
> numbers from a file, and there they are in the standard C notation that I've
> used in my example.
>
> Shlomi:
> Thanks for the heads up about how to write good code. I'm still very much a
> beginner...
> Also, thanks for consulting perl5-porters. If it is a bug, and it is fixed,
> then I will indeed port my C code to perl.
>
>
>
> On Mon, Sep 20, 2010 at 11:40 PM, Jon Hermansen <jon.herman...@gmail.com>
> wrote:
>>
>> Hi Abu,
>>  This code works for me:
>>
>> #!/usr/bin/perl
>>
>> my $d1, $d2, $sum;
>>
>> $d1 = 6.892964 * 10 ** -309;
>> $d2 = 1.102874 * 10 ** -307;
>>
>> $sum = $d1 + $d2;
>>
>> printf("d1 = %e\n", $d1);
>> printf("d2 = %e\n", $d2);
>> printf("sum = %e\n", $sum);
>>
>> On Mon, Sep 20, 2010 at 1:30 PM, Abu Yoav <abuy...@gmail.com> wrote:
>> > Hi,
>> >
>> > I wanted to port a small c program to perl. However, the two programs
>> > behave
>> > differently with respect to very small "double" values. The behavior
>> > seems
>> > like a bug to me, but since I'm very new to perl, I thought I might ask
>> > the
>> > list first.
>> >
>> > Relevant code and output follows. Thanks!
>> >
>> > --- c code ---
>> > #include<stdio.h>
>> >
>> > int main (int argc, char** argv)
>> > {
>> > double d1, d2, sum;
>> >
>> > d1 = 6.892964e-309;
>> > d2 = 1.102874e-307;
>> >
>> > sum = d1 + d2;
>> >
>> > printf("d1 = %e\n", d1);
>> > printf("d2 = %e\n", d2);
>> > printf("sum = %e\n", sum);
>> >
>> > return 0;
>> > }
>> >
>> > --- perl code ---
>> > #!/usr/bin/perl
>> >
>> > my $d1, $d2, $sum;
>> >
>> > $d1 = "6.892964e-309";
>> > $d2 = "1.102874e-307";
>> >
>> > $sum = $d1 + $d2;
>> >
>> > printf("d1 = %e\n", $d1);
>> > printf("d2 = %e\n", $d2);
>> > printf("sum = %e\n", $sum);
>> >
>> > --- c output ---
>> > d1 = 6.892964e-309
>> > d2 = 1.102874e-307
>> > sum = 1.171804e-307
>> >
>> > --- perl output ---
>> > d1 = 0.000000e+00
>> > d2 = 1.000000e-307
>> > sum = 1.000000e-307
>> >
>
>

--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to