- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
阅读此question和此msdn blog之后,我尝试了一些示例对此进行测试:
Console.WriteLine(0.8-0.7 == 0.1);
False
。因此,我尝试将双方的表达式都强制转换为
double
和
float
,以查看是否可以获得不同的结果:
Console.WriteLine((float)(0.8-0.7) == (float)(0.1));
Console.WriteLine((double)(0.8-0.7) == (double)(0.1));
True
但第二行输出
False
,为什么会发生这种情况?
Console.WriteLine(8-0.7 == 7.3);
Console.WriteLine(8.0-0.7 == 7.3);
True
。还有...
Console.WriteLine(18.01-0.7 == 17.31);
False
。如果将两者都用浮点数相减,则如何从减法18.01中减去8的差?
Console.WriteLine(8.001-0.001 == 8); //this return false
Console.WriteLine(8.01-0.01 == 8); //this return true
最佳答案
0.8−0.7的情况
在0.8-0.7 == 0.1
中,没有任何文字可以在double
中精确表示。最接近的可表示值是0.8的0.8000000000000000444089209850062616169452667236328125、0.7的0.6999999999999999555910790149937383830547332763671875和0.1的0.1000000000000000055511151231257827021181583404541015625。当减去前两个时,结果为0.100000000000000088817841941970012523233890533447265625。由于这不等于第三个,因此0.8-0.7 == 0.1
的计算结果为false。
在(float)(0.8-0.7) == (float)(0.1)
中,0.8-0.7
和0.1
的结果分别转换为float
。最接近前者的float
值0.1000000000000000055511151231257827021181583404541015625为0.100000001490116119384765625。最接近后者的float
值0.100000000000000088817841970012523233890533447265625为0.100000001490116119384765625。由于这些相同,因此(float)(0.8-0.7) == (float)(0.1)
评估为true。
在(double)(0.8-0.7) == (double)(0.1)
中,0.8-0.7
和0.1
的结果分别转换为double
。由于它们已经是double
,因此没有效果,结果与0.8-0.7 == 0.1
相同。
笔记
C# specification, version 5.0表示float
和double
是IEEE-754 32位和64位浮点类型。我没有看到它明确指出它们是二进制浮点格式,而不是十进制格式,但是所描述的特征使这一点显而易见。该规范还指出,除以下例外情况外,通常使用IEEE-754算术,取整为最近(大概取整为整数)。
C#规范允许比标称类型更精确地执行浮点运算。第4.1.6节说:“ ...浮点运算的执行精度可能高于运算的结果类型……”这通常会使浮点表达式的分析复杂化,但是在
0.8-0.7 == 0.1
减去
0.7
,并且这些数字在同一个binade中(在浮点表示中具有相同的2的幂),因此相减的结果可精确表示并且更高的精度不会改变结果。只要将源文本
0.8
,
0.8
和
0.7
转换为
0.1
时不使用额外的精度,并且将转换为
double
的结果生成的
float
也没有额外的精度,结果将是如上所述。 (C#标准在第6.2.1节中说,从
float
到
double
的转换会产生一个
float
值,尽管它没有明确指出此时不能使用任何额外的精度。)
其他案例
在
float
中,对于
8-0.7 == 7.3
为8,对于
8
为
7.29999999999999982236431605997495353221893310546875
,对于
7.3
为0.6999999999999999555910790149937383830547332763671875,对于
0.7
为7.29999999999999982236431605997495353221893310546875,因此结果为true。
请注意,C#规范允许的附加精度可能会影响
8-0.7
的结果。对于这种情况,使用额外精度的C#实现在这种情况下可能会产生false,因为对于
8-0.7
它将获得不同的结果。
在
8-0.7
中,对于
18.01-0.7 == 17.31
我们有18.010000000000001563194018672220408916473388671875,对于
18.01
是
0.6999999999999999555910790149937383830547332763671875
,对于
0.7
是
17.309999999999998721023075631819665431976318359375
,对于
17.31
是
17.31000000000000227373675443232059478759765625
,因此结果为假。
如果将两者都用浮点数相减,则如何从减法18.01中减去8的差?
18.01大于8,并且在其浮点表示形式中需要2的更大幂。同样,
18.01-0.7
的结果大于
18.01-0.7
的结果。这意味着有效位中的位(浮点表示的小数部分,由2的幂进行缩放)表示更大的值,从而导致浮点运算中的舍入误差通常更大。通常,浮点格式具有固定的跨度-从保留的高位到保留的低位有固定的距离。当您更改为左侧有更多位(高位)的数字时,右侧有一些位(低位)被推出,结果将改变。
关于c# - double float 和 float 精度之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56749949/
下面的代码有效,我觉得double(double)和double(*)(double)没有区别,square和 &square,我说得对吗? #include double square(doubl
我知道我的作业很草率,这是我在这门课上的第 4 次作业。任何帮助将不胜感激,谢谢。 double getPrincipal(0); double getRate(0); double getYe
我遇到了那个错误,当我使用类时,我在使用函数指针时遇到了这个错误。我的函数'ope'函数我该如何解决 evaluator::function(){ double (*ope) (dou
问题://故事从哪里开始 Graphics 类型中的方法 drawLine(int, int, int, int) 不适用于参数 (double, double, double, double) g.
我有一张 map> m1 形式的 map .我可以将其复制到 map m2 形式的 map 吗?这样键是相同的,并且 m2 中的值是 get(m1->second) 不使用循环?谢谢! 最佳答案 这样
有没有办法获取vector> 的“.first”和“.second”的连续内存? ?我的意思是: void func(int N, double* x, double* y) { for (i
我正在尝试将自定义 lambda 传递给需要函数指针的函数(更准确地说是 zero 中的 Brent library 函数)。 我的想法是,我将使用参数创建一次 lambda,然后用多个值对其求值 x
这是一个很简单的问题,让我很困惑。 我收到一个源文件的以下错误,但另一个没有: 4 src/Source2.cpp:1466: error: no matching function for cal
struct CalculatorBrain { private var accumulator: Double? func changeSign(operand: Double) -
在我正在进行的项目中,我尝试使用 curlpp库来发出一个简单的 html GET 请求。当我将 cpp 文件传递给 g++ 时,出现以下错误: /usr/local/include/curlpp
不使用double就能获得quadruple精度超过16位的数字吗?如果可能的话,这取决于编译器还是其他?因为我知道有人说他使用double精度,并且具有22位精度。 最佳答案 数据类型double
我正在寻找有关特斯拉 GPU 中硬件如何实现 double 的信息。我读到,两个流处理器正在处理单个 double 值,但我没有找到 nvidia 的任何官方论文。 提前致谢。聚苯硫醚为什么大多数 G
这个问题在这里已经有了答案: Passing capturing lambda as function pointer (10 个答案) 关闭 2 年前。 我有这个错误 error: cannot
情况:我有一个元组列表,其中添加了一个元组: List> list = new List>(); list .Add(new Tuple(2.2, 6.6)); 一切似乎都还好。但是......在 D
我有一个 JList,里面有一堆名字,还有一个包含这些名字值的数组 final Double[] filmcost = { 5.00, 5.50, 7.00, 6.00, 5.00 }; 我想做的是,
我试图找出牛顿法来求方程的根。这个错误出来了,我无法处理。 double fn(double n){ return sin(n)+log(n)-1; } double f1n(double n
我有一个 junit 测试断言两个 Double 对象,具有以下内容: Assert.assertEquals(Double expected, Double result); 这很好,然后我决定将其
我正在尝试引入部分数据文件来填充数组,用户尝试了三次输入正确的数据文件名。我一再遇到这些错误。我知道像 arr 这样的数组只是一个指向内存块的指针。 #include #include #incl
我正在尝试完成复习题(为即将到来的编程决赛),但是,我无法解决这个问题,因为我不断收到错误(标题)。正如预期的那样,我将发布问题和我尝试的解决方案。 问题: 给定以下函数定义:void swap(do
任何人都知道如何实现这一目标。我已经尝试了通常的公式,但我只得到正数 Double.NEGATIVE_INFINITY) return d; } } 这将以相同的概率
我是一名优秀的程序员,十分优秀!