递归火山软件开发平台

标题: 乘法运算,小数点位数多了结果等于0 [打印本页]

作者: 1980882096    时间: 2023-11-10 21:46
标题: 乘法运算,小数点位数多了结果等于0
本帖最后由 1980882096 于 2023-11-10 21:48 编辑

比如  0.2*0.000001  结果是0           2*0.000001 结果也是0           
这是为什么




作者: urenai    时间: 2023-11-10 22:08
你要非要个结果,就把这2个值  强转到小数。

作者: suyan    时间: 2023-11-10 22:16
前面加上(小数)
作者: urenai    时间: 2023-11-10 22:24
算了把,还是我年轻了。

<火山程序 类型 = "通常" 版本 = 1 />

变量 f <类型 = 小数>
f = (小数)0.2 * (小数)0.000001
调试输出 (指针到字节集 (取变量地址 (f), 8))

<字节集> 总共 8 个字节:
[00000000]: 00 00 00 00 00 00 00 00                         | ........
作者: Xelloss0618    时间: 2023-11-10 22:47
本帖最后由 Xelloss0618 于 2023-11-10 22:54 编辑

因为浮点数的精度损失,没有准确意义上的零,所以一般把小于等于 1e-6(即 0.000001)的浮点数约等于 0。
你的乘值刚好等于 1e-6,所以在火山里等于 2 * 0 了
作者: suyan    时间: 2023-11-10 23:20
X大佬的最专业
作者: 创世魂    时间: 2023-11-11 09:33
X大佬的最专业
作者: weilai    时间: 2023-11-11 10:30
X大佬的最专业
作者: b0y    时间: 2023-11-11 10:39
Xelloss0618 发表于 2023-11-10 22:47
因为浮点数的精度损失,没有准确意义上的零,所以一般把小于等于 1e-6(即 0.000001)的浮点数约等于 0。
...

那要是需要这样的计算 用双精度可以吗
作者: Xelloss0618    时间: 2023-11-11 11:00
b0y 发表于 2023-11-11 10:39
那要是需要这样的计算 用双精度可以吗

火山已经是双精度了,不过这还是要让火山背锅。
因为 C/C++ 是能正确计算出 2 * 0.000001 = 0.000002 的,这并不是约等于 0。

但火山在翻译成 C++ 源码时,是直接给出立即数的计算结果。
比如代码是 double v = 2 *  0.000001,火山翻译出来是 double v = 0;
可以看出火山的这个计算精度很差,本来应该是 0.000002,却给出了 0。

如果你需要在火山做高精度计算,不要用立即数,而是把计算过程中的所有值都用变量保存,再进行计算。
作者: 1980882096    时间: 2023-11-11 11:29
suyan 发表于 2023-11-10 22:16
前面加上(小数)

没用的,都试过
作者: 1980882096    时间: 2023-11-11 12:29
Xelloss0618 发表于 2023-11-11 11:00
火山已经是双精度了,不过这还是要让火山背锅。
因为 C/C++ 是能正确计算出 2 * 0.000001 = 0.000002 的 ...

多谢大佬解惑
作者: 1980882096    时间: 2023-11-11 12:54
本帖最后由 1980882096 于 2023-11-11 12:58 编辑
Xelloss0618 发表于 2023-11-11 11:00
火山已经是双精度了,不过这还是要让火山背锅。
因为 C/C++ 是能正确计算出 2 * 0.000001 = 0.000002 的 ...

就算用变量保存,超过6位的话还是返回0,请问大佬有办法解决吗,感觉火山这个小数并不是双精度的,文本到小数 ("0.0000001")这也是返回0
作者: Xelloss0618    时间: 2023-11-11 14:46
1980882096 发表于 2023-11-11 12:54
就算用变量保存,超过6位的话还是返回0,请问大佬有办法解决吗,感觉火山这个小数并不是双精度的,文本到 ...

火山的小数就是双精度的,是“调试输出”这个命令的精度比较低,小于 1e-6 就输出 0 了,你可以用
调试输出 (取格式文本 ("%.8f", 0.0000001))
作者: 1980882096    时间: 2023-11-11 16:06
Xelloss0618 发表于 2023-11-11 14:46
火山的小数就是双精度的,是“调试输出”这个命令的精度比较低,小于 1e-6 就输出 0 了,你可以用
调试输 ...



(, 下载次数: 52)



大佬,有办法解决高精度计算吗?

作者: 1980882096    时间: 2023-11-11 20:33
解决了,是 到文本这个命令丢失精度,用数值到格式文本就解决了,顺便 @shuimiao  的json写小数值用的到文本,高精度写不进去
作者: weilai    时间: 2023-11-11 21:07
(, 下载次数: 4)
刚写了个小数文本互转的,支持高精度,可以试试

作者: 1980882096    时间: 2023-11-11 21:27
weilai 发表于 2023-11-11 21:07
刚写了个小数文本互转的,支持高精度,可以试试

还是数值到格式文本这个命令好一点,全精度的,你这个效率不高
作者: weilai    时间: 2023-11-11 21:36
你试了?能正确运行就算不错了,还没有对速度优化过




欢迎光临 递归火山软件开发平台 (https://bbs.voldp.com/) Powered by Discuz! X3.4