hey Posted January 5, 2019 Share Posted January 5, 2019 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.02.0 Java: public class Foo{public static void main(String args[]){System.out.println(9999999999999999.0-9999999999999998.0);}}2.0 Python: >>> 9999999999999999.0 - 9999999999999998.02.0 Rebol: >> 9999999999999999.0 - 9999999999999998.0 == 2.0 Haskell: Prelude> 9999999999999999.0 - 9999999999999998.02.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.02f 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/null2 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.01 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 More sharing options...
Rony Posted January 5, 2019 Share Posted January 5, 2019 C# can be fixed with : 9999999999999999.0m - 9999999999999998.0m Link to comment Share on other sites More sharing options...
mp68terr Posted January 5, 2019 Share Posted January 5, 2019 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 More sharing options...
Bizarre™ Posted January 6, 2019 Share Posted January 6, 2019 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 Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.