C代码并使接近零的负值为零

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

我正在处理一个具有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.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标准和其他常见定义中的定义,每个浮点格式都能够精确地表示零。