It's a simple question:

9999999999999999.0 - 9999999999999998.0

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 C: main(){printf("%lf

",(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

", a-b)

2.000000 Perl: $ perl -e 'print 9999999999999999.0-9999999999999998.0;print "

";'

2.0 Perl6: $ perl6 -e 'print 9999999999999999.0-9999999999999998.0;print "

";'

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")))

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

";'

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

", 9999999999999999.0-9999999999999998.0)