Jump to content

Simple question, yeh yeh: 9999999999999999.0 - 9999999999999998.0


hey

Recommended Posts

It's a simple question:

9999999999999999.0 - 9999999999999998.0

Does your favorite language give the right answer?

 

Ruby: irb(main):001:0> 9999999999999999.0 - 9999999999999998.0
2.0
Java: public class Foo{public static void main(String args[]){System.out.println(9999999999999999.0-9999999999999998.0);}}
2.0
Python: >>> 9999999999999999.0 - 9999999999999998.0
2.0
Rebol: >> 9999999999999999.0 - 9999999999999998.0
== 2.0
Haskell: Prelude> 9999999999999999.0 - 9999999999999998.0
2.0
TCL: % expr "9999999999999999.0-9999999999999998.0"
0.0
Emacs Lisp: ELISP> (- 9999999999999999.0 9999999999999998.0)
2.0
Common–Lisp: [1]> (- 9999999999999999.0 9999999999999998.0)
0.0
Maxima: (%i1) 9999999999999999.0-9999999999999998.0;
(%o1)                                2.0
Google: 0
K/Q: q)9999999999999999.0-9999999999999998.0
2f
R: > 9999999999999999.0-9999999999999998.0
[1] 2
Erlang: 1> 9999999999999999.0-9999999999999998.0 .
2.0
😄 main(){printf("%lf\n",(double)9999999999999999.0-9999999999999998.0);}
2.000000
AWK: $ awk 'END{print 9999999999999999.0-9999999999999998.0}'</dev/null
2
GoLang: var a = 9999999999999999.0; var b = 9999999999999998.0; fmt.Printf("%f\n", a-b)
2.000000
Perl: $ perl -e 'print 9999999999999999.0-9999999999999998.0;print "\n";'
2.0
Perl6: $ perl6 -e 'print 9999999999999999.0-9999999999999998.0;print "\n";'
1
Wolfram: 1
soup:    9999999999999999.0-9999999999999998.0
1

Several of the results surprised me. Did they surprise you?

Note that some of the wrong answers can be fixed with various workarounds. For example Common–Lisp gives the correct answer for:

(let ((*read-default-float-format* 'long-float))
  (- (read-from-string "9999999999999999.0") (read-from-string "9999999999999998.0")))

and Perl will give the correct answer for:

perl -mMath::BigFloat -e 'print Math::BigFloat->new("9999999999999999.0")
 - Math::BigFloat->new("9999999999999998.0");print "\n";'

 

Using one of these workarounds requires a certain prescience of the data domain, so they were not generally considered for the table above.

I know that GoLang will produce the correct answer for

fmt.Printf("%f\n", 9999999999999999.0-9999999999999998.0)

but not if the values are read. That Go uses arbitrary-precision for constant expressions seems dangerous to me.

 

Source

Link to comment
Share on other sites


  • Replies 3
  • Views 972
  • Created
  • Last Reply

Those using languages (used by human beings to communicate) would say 1.

Linux simple calculator says 1.

Some programming languages fail...

Link to comment
Share on other sites


This reminds me when I update my compiler and I'm forced to re-calibrate and/or edit the files of the program I'm compiling. This taught me not to update my compiler regularly :tehe:

Link to comment
Share on other sites


Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...