数字类型(函数 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"
是最接近的 BigFloat
。 FunctionAccuracyTests
的工作方式是针对 x
的 bigfloat 版本测试函数,而不是 x
接近的十进制数的 bigfloat 版本。这是您测试函数准确性所需要的,但在这里有点混乱。
我是 运行 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"
是最接近的 BigFloat
。 FunctionAccuracyTests
的工作方式是针对 x
的 bigfloat 版本测试函数,而不是 x
接近的十进制数的 bigfloat 版本。这是您测试函数准确性所需要的,但在这里有点混乱。