如何解决为什么从Array转换为Float32Array时值会有所不同?
从Array
转换为Float32Array
时,我注意到值的差异,如下例所示:
var aPoints = [];
for (var i = 0; i < 16; i++) {
aPoints.push(Math.random())
}
console.log('aPoints array',aPoints);
aPointsF = new Float32Array(aPoints);
for (var i = 0; i < 16; i++) {
console.log(Math.abs(aPoints[i] - aPointsF[i]));
}
我希望差异为零,但是循环的确显示出差异,尽管很小。
那是为什么?
解决方法
通常,您永远不应该比较浮点值(在任何语言中,这都不是js特定的问题),如果需要,您需要检查类似这样的内容
df['Points Against'] = df[['Points Against']].groupby(
(df.index.to_series()/2).astype(int)
).transform(lambda x: x[::-1])
。
当您以任何方式对浮点数进行运算时,由于精度是有限的,因此结果不准确,因此需要对结果进行四舍五入,并且四舍五入是指二进制表示形式,而不是十进制数。
在这种情况下,您将Math.abs(a-b)<very_small_value
(最有可能是float64)类型转换为float32,因此,如果您将Number
写入0.1234567
,则转换后的值可能是{{1} }。这两个值只是为了说明正在发生的事情,实际上,它不会仅减少最后的小数点,因为我要说的四舍五入发生在二进制表示形式上。
您可以在http://cstl-csm.semo.edu/xzhang/Class%20Folder/CS280/Workbook_HTML/FLOATING_tut.htm
上详细了解如何以二进制表示浮点数。版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。