如何解决C 代码并使接近零的负值为零
我正在处理具有 X Y Z 点的网格模型,因此我想沿 Y=0 平面将模型切成两半。以下是我正在处理的数据示例。即使我使用 Y=0 平面切割网格,网格从我的 CAD 程序中导出后会发生什么,我仍然会得到一些 Y 值,例如 -0.0000001234。
我的模型是英寸,我只需要精度/正确性到 0.001 或 0.0001。在那之后,像 -0.000001 或更多的负数我只想成为 0.0 没有 -
-18.801138 0.188375 39.370000
-19.209594 0.124526 39.370000
-19.650462 0.055230 39.370000
-19.245374 -0.000000 39.370000
-18.641099 -0.000000 39.370000
-18.212279 -0.000000 39.370000
-17.835492 -0.000000 39.370000
-17.505417 -0.000000 39.370000
-17.136364 -0.000000 39.370000
-16.704553 -0.000000 39.370000
-16.305413 -0.000000 39.370000
-15.932022 -0.000000 39.370000
-15.500000 -0.000024 39.370000
玩过这个数据集后,我仍然不明白为什么即使我读入这个样本 XYZ 数据集,它是一个 ascii 文本文件,就像你在那里看到的一样。
当我这样做
double y;
/* read that -0.000000 from the text file and store into y */
if ( y < 0 )
y = 0;
为什么负号一直存在?这种事情有名字吗,最好的处理方法是什么?我基本上预先知道任何 Y 值都不应该是负数,所以如果是的话,我希望它在我的文本文件中打印为 0.000000
,但我没能做到。
这是在基本 C 语言中,使用 gcc,在 RHEL 7.9 x86-64 中。
更新:刚刚识别出 y = 0
并将其更改为 y = 0.0
,这似乎更正了 -0.000000
。至于为什么这一切在技术上会发生,如果有人可以解释会很酷。
解决方法
让我们首先说对于双精度数字,0 是有符号的。引用 IEEE 754 standard:
此外,有两个零值,称为有符号零:符号位指定零是 +0(正零)还是 -0(负零)。
至于为什么该值在测试后仍然存在,您正在检查该值是否小于 0。-0 不小于 0,它等于 0,因此您的 y = 0;
行永远不会执行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。