数字类型(函数 returns "wrong" 结果)

number types (function returns "wrong" result)

我是 运行 Function Accuracy Test 工具(在 64 位 Ubuntu 18.04 上的 Julia 1.7.2 中)并测试 sin() 函数。问题是函数调用给出的结果 sin(x...) 和 sin(big, x)...)。

下面是几个输入值 (Float16) 的示例:

   ( Range: -0.7853982f0:1.570798f-6:0.7853982f0  )
    x -0.7853982     
    Comparison: sin(x...) -0.70710677 vs sin(map(big, x)...) -0.7071067966408574982218873068639201062404313604169267415232690981467895117867091
    x -0.78539664     
    Comparison: sin(x...) -0.7071057 vs sin(map(big, x)...) -0.7071057008219710592610583916121386335507498121453599174530436043153324651900249
    x -0.785395     
    Comparison: sin(x...) -0.70710456 vs sin(map(big, x)...) -0.7071045628544069335831518159655666916535017380441150694175707960861677701383995
    x -0.7853935     
    Comparison: sin(x...) -0.7071035 vs sin(map(big, x)...) -0.7071034670320587628440324684003875993008018017656187324934698375469763027284935

第一个 x 值的调试数据:

Wolfram|Alpha (and Octave) 给出了不同的结果:

sin(-0.7853982) = -0.707106807068459559730712471249650919086696271494555843865775956...
sin(-0.78539664)= -0.707105703981060877385398550052561039837195399228112767226085558...
sin(-0.785395)  = -0.707104544323222201909737214474462553610953144479787635566743062...
sin(-0.7853935) = -0.707103483658899645499967038364728301664644014034519844381265599...

Octave 结果与 Wolfram|Alpha 相同。

哪些结果是正确的?

我如何(用什么数字类型)从 Julia 获得相同的结果?

这只是你取sin个不同的数字。 -0.7853982f0!=-0.7853982!=big"-0.7853982"。关键是大多数带小数的数字不能完全表示为二进制浮点数。 -0.7853982f0 是最接近十进制数的 Float32-0.7853982 是最接近的 Float64 值,big"-0.7853982" 是最接近的 BigFloatFunctionAccuracyTests 的工作方式是针对 x 的 bigfloat 版本测试函数,而不是 x 接近的十进制数的 bigfloat 版本。这是您测试函数准确性所需要的,但在这里有点混乱。