C代码并使接近零的负值为零
我正在处理一个具有X Y Z点的网格模型,因此我希望沿Y=0平面将模型切成两半。下面是我正在处理的数据示例。如果网格从我的CAD程序中导出,即使我使用Y=0平面进行切割,我仍然会得到一些Y值,如-0.0000001234 我的型号是英寸,我只需要精确到0.001或0.0001。在那之后,像-0.000001或者更负的,我只想是0.0,没有一个-C代码并使接近零的负值为零,c,zero,C,Zero,我正在处理一个具有X Y Z点的网格模型,因此我希望沿Y=0平面将模型切成两半。下面是我正在处理的数据示例。如果网格从我的CAD程序中导出,即使我使用Y=0平面进行切割,我仍然会得到一些Y值,如-0.0000001234 我的型号是英寸,我只需要精确到0.001或0.0001。在那之后,像-0.000001或者更负的,我只想是0.0,没有一个- -18.801138 0.188375 39.370000 -19.209594 0.124526 39.370
-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并存储到y中*/
if(y<0)
y=0;
为什么负面信号持续存在?这类事情有名字吗?最好的处理方法是什么?我基本上预先知道任何Y值都不应该是负数,所以如果是,我希望它在我的文本文件中以0.000000
的形式打印出来,但我一直无法做到这一点
这是在RHEL 7.9 x86-64中使用gcc的basic C语言编写的
更新:刚刚识别出
y=0
并将其更改为y=0.0
,这似乎纠正了-0.000000
。至于为什么技术上会发生这种情况,如果有人能解释的话,那就太酷了。让我们先说,对于双精度数字,0是有符号的。引述:
此外,还有两个零值,称为有符号零:符号位指定零是+0(正零)还是零−0(负零)
至于测试后该值持续存在的原因,您正在检查该值是否小于0-0不小于0,等于0,所以你的
y=0代码>行从不执行。让我们先说,对于双精度数字,0是有符号的。引述:
此外,还有两个零值,称为有符号零:符号位指定零是+0(正零)还是零−0(负零)
至于测试后该值持续存在的原因,您正在检查该值是否小于0-0不小于0,等于0,所以你的y=0代码>行永远不会执行。您使用的是浮点数,完美的0.0在内存中不存在,请检查浮点数是如何存储的,这可能是因为我认为y=0;
和y=0.0;
应该编译成完全相同的机器代码指令。它确实存在,存在隐式转换。使用(y@SidoShiro92:根据C标准中的定义和其他常见定义,每种浮点格式都能够精确地表示零。如果您使用的是浮点数,则完美的0.0不会”t内存中不存在,检查浮点数是如何存储的,这可能是因为我认为y=0;
和y=0.0;
应该编译成完全相同的机器代码指令。它确实存在,有一个隐式转换。使用(y@SidoShiro92:根据C标准和其他常见定义中的定义,每个浮点格式都能够精确地表示零。