Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 比较浮点数之和_C#_Visual Studio_Unity3d - Fatal编程技术网

C# 比较浮点数之和

C# 比较浮点数之和,c#,visual-studio,unity3d,C#,Visual Studio,Unity3d,我在Unity中运行此代码(Mono后端与.NET4.x) 在调试中(使用Visual Studio),compare1为false,而compare2为true 这是怎么发生的?为什么最后两行不同?我认为你遇到了一个非常常见的数字精度错误,叫做a。对浮点值求和时,需要包含一个容错。这种错误是所有编程语言中浮点数学运算固有的 您的代码应更改为以下内容: const float errorTolerance = 0.000001f; float target1 = a + b; float tar

我在Unity中运行此代码(Mono后端与.NET4.x)

在调试中(使用Visual Studio),
compare1
false
,而
compare2
true


这是怎么发生的?为什么最后两行不同?我认为你遇到了一个非常常见的数字精度错误,叫做a。对浮点值求和时,需要包含一个容错。这种错误是所有编程语言中浮点数学运算固有的

您的代码应更改为以下内容:

const float errorTolerance = 0.000001f;
float target1 = a + b;
float target2 = sum;
bool compare1 = Math.Abs(target1 - 1f) <= errorTolerance;
bool compare2 = Math.Abs(target2 - 1f) <= errorTolerance;
const float errorTolerance=0.000001f;
浮动目标1=a+b;
浮动目标2=总和;
bool compare1=Math.Abs(target1-1f)来自:

2.)浮点中间结果通常在寄存器中使用80位精度,但在内存中仅使用64位精度

我相信,
sum=a+b
会生成一条指令,将结果存储在内存中,作为最大64位的浮点

由于编译器优化,机器代码
(a+b)>=1f
似乎没有强制转换为有限的浮点类型,并且显然使用了更高的位深度,可以观察到数字加起来不等于1

我们可以通过强制执行
(float)(a+b)
来强制内存存储

根据Enigmativity的评论:

[…]如果启用或未启用编译器优化,则输出不同。当它打开时,我会变得真实。当它关闭时,我会变得虚假和真实


它们是花车。阅读浮点数学的本质。大多数浮点数是它们要表示的数字的近似值。切勿检查浮点或双精度是否相等。在这里,您检查的是
==1f
,但实际上,您检查的是
==1f
,我有浮点运算的理论知识。但我本以为最后几行也会有同样的结果。我会澄清这个问题。@dodgy_编码器我发现:“浮点中间结果通常在寄存器中使用80位精度,但在内存中仅使用64位精度”。如果您可以链接到另一个副本,那就太好了。即使是我链接的答案()也比当前的副本清晰得多。
const float errorTolerance = 0.000001f;
float target1 = a + b;
float target2 = sum;
bool compare1 = Math.Abs(target1 - 1f) <= errorTolerance;
bool compare2 = Math.Abs(target2 - 1f) <= errorTolerance;