From: Ryo on
Hi all,

I thought ".to_s.to_f" should be an identity operation on any floating
point number, apart from a potential truncation error.

On Ruby 1.8.7,

a = 0.0/0.0
a.to_s # => "NaN"
"NaN".to_f #=> 0.0

Therefore,

a.to_s.to_f #=> 0.0,

which isn't acceptable to me. Consider writing floating point numbers
to a text file and reading them back in.

Is this a bug in 1.8.x? I searched Google but couldn't get a
definitive answer.

Regards,
Ryo
From: Rob Biedenharn on

On Aug 10, 2010, at 8:30 PM, Ryo wrote:

> Hi all,
>
> I thought ".to_s.to_f" should be an identity operation on any floating
> point number, apart from a potential truncation error.
>
> On Ruby 1.8.7,
>
> a = 0.0/0.0
> a.to_s # => "NaN"
> "NaN".to_f #=> 0.0
>
> Therefore,
>
> a.to_s.to_f #=> 0.0,
>
> which isn't acceptable to me. Consider writing floating point numbers
> to a text file and reading them back in.
>
> Is this a bug in 1.8.x? I searched Google but couldn't get a
> definitive answer.
>
> Regards,
> Ryo
>
If you want to round-trip to a file, use something like Marshal or YAML

a = 0.0/0.0

irb> Marshal.dump(a)
=> "\x04\bf\bnan"

b = Marshal.load(Marshal.dump(a))
a.nan? #=> true
b.nan? #=> true

irb> require 'yaml'
=> true
irb> a.to_yaml
=> "--- .NaN\n"
irb> c=YAML.load(a.to_yaml)
=> NaN
irb> c.nan?
=> true

-Rob

Rob Biedenharn
Rob(a)AgileConsultingLLC.com http://AgileConsultingLLC.com/
rab(a)GaslightSoftware.com http://GaslightSoftware.com/


From: Yukihiro Matsumoto on
Hi,

In message "Re: "NaN".to_f revisited"
on Wed, 11 Aug 2010 09:30:14 +0900, Ryo <furue(a)hawaii.edu> writes:

|I thought ".to_s.to_f" should be an identity operation on any floating
|point number, apart from a potential truncation error.

That would be a good property. The reason behind String#to_f not
supporting NaN and Inf is that I couldn't give up non IEEE754 floating
point architecture such as VAX at the time I implemented.

But we are no longer see any non-IEEE754 architecture around, and
current implementation of Ruby would require IEEE754 anyway, so it
might be a good chance to introduce roundtrip nature.

matz.

From: Brian Candler on
Might give some strange behaviour though:

"1$".to_f => 1.0
"nonsense".to_f => 0.0
"nanotubes".to_f => Nan ?
"inferiority".to_f => Inf ?
--
Posted via http://www.ruby-forum.com/.

From: Caleb Clausen on
On 8/11/10, Brian Candler <b.candler(a)pobox.com> wrote:
> Might give some strange behaviour though:
>
> "1$".to_f => 1.0
> "nonsense".to_f => 0.0
> "nanotubes".to_f => Nan ?
> "inferiority".to_f => Inf ?

Normally if the string starts with non-numeric characters, converting
to numbers yields a zero result. This is to remain consistent with
atof and strtod from the standard c library. On my machine, the man
page for strtod contains this paragraph:

Alternatively, if the portion of the string following the optional plus
or minus sign begins with ``INFINITY'' or ``NAN'', ignoring case, it is
interpreted as an infinity or a quiet NaN, respectively.

In practice, strtod seems to actually recognize INF rather than the
fully-spelled-out INFINITY as the trigger for returning infinity. So,
your last 2 examples would return NaN and Inf if passed to strtod.