sharplispers/parse-number

Problem with parsing double-floats in LispWorks

Closed this issue · 3 comments

I tried: (parse-number:parse-number "1e10" :float-format 'double-float)

And got: 1.000000000000004D10

Haven't had this problem in other CL implementations.

Please run the test suite and paste the output here: (asdf:test-system :parse-number)

I found the reason for this. (expt 10.0d0 10) in LW returns 1.000000000000004D10, and parse-number uses (expt) to generate its double-float output. I'm going to bring it up with LW's tech support. If it's helpful for you, I'm attaching the test output below. That said the root of the problem has been found so I'll close this issue.

    String value (      READ value) = Parsed value     *rdff*          

               "1" (                         1) = 1                          DOUBLE-FLOAT        
               "1" (                         1) = 1                          SINGLE-FLOAT        
              "-1" (                        -1) = -1                         DOUBLE-FLOAT        
              "-1" (                        -1) = -1                         SINGLE-FLOAT        
            "1034" (                      1034) = 1034                       DOUBLE-FLOAT        
            "1034" (                      1034) = 1034                       SINGLE-FLOAT        
              "3." (                         3) = 3                          DOUBLE-FLOAT        
              "3." (                         3) = 3                          SINGLE-FLOAT        
             "-3." (                        -3) = -3                         DOUBLE-FLOAT        
             "-3." (                        -3) = -3                         SINGLE-FLOAT        
            "-364" (                      -364) = -364                       DOUBLE-FLOAT        
            "-364" (                      -364) = -364                       SINGLE-FLOAT        
          "80/335" (                     16/67) = 16/67                      DOUBLE-FLOAT        
          "80/335" (                     16/67) = 16/67                      SINGLE-FLOAT        
          "1.3214" (                    1.3214) = 1.3214                     DOUBLE-FLOAT        
          "1.3214" (                    1.3214) = 1.3214                     SINGLE-FLOAT        
          "3.5333" (                    3.5333) = 3.5333                     DOUBLE-FLOAT        
          "3.5333" (                    3.5333) = 3.5333                     SINGLE-FLOAT        
           "2.4E4" (                   24000.0) = 24000.000000000022         DOUBLE-FLOAT        
           "2.4E4" (                   24000.0) = 24000.0                    SINGLE-FLOAT        
           "6.8d3" (                    6800.0) = 6800.000000000004          DOUBLE-FLOAT        
           "6.8d3" (                  6800.0D0) = 6800.000000000004D0        SINGLE-FLOAT        
            "#xFF" (                       255) = 255                        DOUBLE-FLOAT        
            "#xFF" (                       255) = 255                        SINGLE-FLOAT        
         "#b-1000" (                        -8) = -8                         DOUBLE-FLOAT        
         "#b-1000" (                        -8) = -8                         SINGLE-FLOAT        
       "#o-101/75" (                    -65/61) = -65/61                     DOUBLE-FLOAT        
       "#o-101/75" (                    -65/61) = -65/61                     SINGLE-FLOAT        
         "13.09s3" (                 13090.0F0) = 13090.0F0                  DOUBLE-FLOAT        
         "13.09s3" (                   13090.0) = 13090.0                    SINGLE-FLOAT        
         "35.66l5" (                 3566000.0) = 3566000.000000007          DOUBLE-FLOAT        
         "35.66l5" (               3566000.0D0) = 3566000.000000007D0        SINGLE-FLOAT        
          "21.4f2" (                  2140.0F0) = 2140.0F0                   DOUBLE-FLOAT        
          "21.4f2" (                    2140.0) = 2140.0                     SINGLE-FLOAT        
         "#C(1 2)" (                   #C(1 2)) = #C(1 2)                    DOUBLE-FLOAT        
         "#C(1 2)" (                   #C(1 2)) = #C(1 2)                    SINGLE-FLOAT        
"#c ( #xF #o-1 ) " (                 #C(15 -1)) = #C(15 -1)                  DOUBLE-FLOAT        
"#c ( #xF #o-1 ) " (                 #C(15 -1)) = #C(15 -1)                  SINGLE-FLOAT        
     "#c(1d1 2s1)" (             #C(10.0 20.0)) = #C(10.000000000000002 20.0) DOUBLE-FLOAT        
     "#c(1d1 2s1)" (         #C(10.0D0 20.0D0)) = #C(10.000000000000002D0 20.0D0) SINGLE-FLOAT        
          "#16rFF" (                       255) = 255                        DOUBLE-FLOAT        
          "#16rFF" (                       255) = 255                        SINGLE-FLOAT        
           "#9r10" (                         9) = 9                          DOUBLE-FLOAT        
           "#9r10" (                         9) = 9                          SINGLE-FLOAT        
"#C(#9r44/61 4f4)" (#C(0.72727275F0 40000.0F0)) = #C(0.72727275F0 40000.0F0) DOUBLE-FLOAT        
"#C(#9r44/61 4f4)" (    #C(0.72727275 40000.0)) = #C(0.72727275 40000.0)     SINGLE-FLOAT        
           "2.56 " (                      2.56) = 2.56                       DOUBLE-FLOAT        
           "2.56 " (                      2.56) = 2.56                       SINGLE-FLOAT        
              "+1" (                         1) = 1                          DOUBLE-FLOAT        
              "+1" (                         1) = 1                          SINGLE-FLOAT        
             "+1." (                         1) = 1                          DOUBLE-FLOAT        
             "+1." (                         1) = 1                          SINGLE-FLOAT        
            "+1.4" (                       1.4) = 1.4                        DOUBLE-FLOAT        
            "+1.4" (                       1.4) = 1.4                        SINGLE-FLOAT        
            "+.14" (                      0.14) = 0.14                       DOUBLE-FLOAT        
            "+.14" (                      0.14) = 0.14                       SINGLE-FLOAT        
           "+0.14" (                      0.14) = 0.14                       DOUBLE-FLOAT        
           "+0.14" (                      0.14) = 0.14                       SINGLE-FLOAT        

    String Value:                    Invalid

           "5 . 5"                          T                                DOUBLE-FLOAT
           "5 . 5"                          T                                SINGLE-FLOAT
            "--10"                          T                                DOUBLE-FLOAT
            "--10"                          T                                SINGLE-FLOAT
             "/20"                          T                                DOUBLE-FLOAT
             "/20"                          T                                SINGLE-FLOAT
             "d10"                          T                                DOUBLE-FLOAT
             "d10"                          T                                SINGLE-FLOAT
           "5/5/5"                          T                                DOUBLE-FLOAT
           "5/5/5"                          T                                SINGLE-FLOAT
           "1.2.3"                          T                                DOUBLE-FLOAT
           "1.2.3"                          T                                SINGLE-FLOAT
           "1d0s0"                          T                                DOUBLE-FLOAT
           "1d0s0"                          T                                SINGLE-FLOAT
             "10/"                          T                                DOUBLE-FLOAT
             "10/"                          T                                SINGLE-FLOAT
             "10d"                          T                                DOUBLE-FLOAT
             "10d"                          T                                SINGLE-FLOAT
         "10.5/20"                          T                                DOUBLE-FLOAT
         "10.5/20"                          T                                SINGLE-FLOAT
         "15/20.5"                          T                                DOUBLE-FLOAT
         "15/20.5"                          T                                SINGLE-FLOAT
          "5/10d0"                          T                                DOUBLE-FLOAT
          "5/10d0"                          T                                SINGLE-FLOAT
         "5d05/10"                          T                                DOUBLE-FLOAT
         "5d05/10"                          T                                SINGLE-FLOAT
           "5d0.1"                          T                                DOUBLE-FLOAT
           "5d0.1"                          T                                SINGLE-FLOAT
         "#x5.0d0"                          T                                DOUBLE-FLOAT
         "#x5.0d0"                          T                                SINGLE-FLOAT
           "#x5l0"                          T                                DOUBLE-FLOAT
           "#x5l0"                          T                                SINGLE-FLOAT
           "10/-5"                          T                                DOUBLE-FLOAT
           "10/-5"                          T                                SINGLE-FLOAT
           "#x5.0"                          T                                DOUBLE-FLOAT
           "#x5.0"                          T                                SINGLE-FLOAT
               "."                          T                                DOUBLE-FLOAT
               "."                          T                                SINGLE-FLOAT
         "#x10/-5"                          T                                DOUBLE-FLOAT
         "#x10/-5"                          T                                SINGLE-FLOATUnexpected failures:
                                                                                         #c(1d1 2s1),
                                                                                         35.66l5,
                                                                                         6.8d3,
                                                                                         2.4E4.

Thanks. If they fix that bug, can you try running the tests again ? It looks like there was more than one failure.