"NaN".to_f revisited

R

Ryo

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
 
R

Rob Biedenharn

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
(e-mail address removed) http://AgileConsultingLLC.com/
(e-mail address removed) http://GaslightSoftware.com/
 
B

Brian Candler

Might give some strange behaviour though:

"1$".to_f => 1.0
"nonsense".to_f => 0.0
"nanotubes".to_f => Nan ?
"inferiority".to_f => Inf ?
 
C

Caleb Clausen

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.
 
F

Fela Winkelmolen

Might give some strange behaviour though:
"1$".to_f => 1.0
"nonsense".to_f => 0.0
"nanotubes".to_f => Nan ?
"inferiority".to_f => Inf ?

well, it's not so much "stranger" than the following I suppose

"24/7".to_f => 24.0
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,773
Messages
2,569,594
Members
45,116
Latest member
LeanneD317
Top