gpt4 book ai didi

javascript - 将 sin() 近似为 {1, 0, -1} 会给出错误的结果

转载 作者:行者123 更新时间:2023-11-28 07:38:37 29 4
gpt4 key购买 nike

我正在尝试创建一个与 sin() 近似的函数,以便它采用值 1、0 或 -1。这段代码

var periodicity = 2 * Math.PI;   
var sin3 = function(t) {
var tmod = (t / periodicity) % 1;
if (tmod < 1/8)
return 0
else if (tmod < 3/8)
return Math.sign(tmod)
else if (tmod < 5/8)
return 0
else if (tmod < 7/8)
return -Math.sign(tmod)
else return 0;
}

有一个问题,当变量是整数/8时,有时会得到不一致的值。例如代码

for (i = 0; i < 32; i++) {
sin3(i/8*2*Math.PI)
}

获取值

[0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 1, 0, -1, -1, -1 , 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0, -1, -1, 0]

第12个元素本应为0,但变成了1。第 16 个元素本应为 0,但变成了 -1。

将周期更改为 1 没有帮助。我认为,在二进制架构上使用增量 2^-n 应该是精确的。

这是一个 fiddle http://jsfiddle.net/ephyckf1/1/

最佳答案

正如您所说,i/8 具有精确的二进制表示形式。
因此 (i/8) * ((2*Math.PI)/(2*Math.PI)) 不会出现浮点舍入误差,但 (i/8*2 *Math.PI)/(2*Math.PI) 将会。这是因为中间结果 (i/8*2*Math.PI) 没有精确的浮点表示。

话虽如此,你为什么还要麻烦呢?对于 i 的每个奇值(包括第 12 个和第 16 个元素),您恰好位于两个不同近似值之间的边界上,因此无论返回哪个都是任意的。

关于javascript - 将 sin() 近似为 {1, 0, -1} 会给出错误的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28315483/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com