你如何向仍然认为计算机是无限智能和准确的新鲜程序员和外行人解释浮点不准确?
你有一个最喜欢的例子或轶事似乎比一个精确但干燥的解释更好地理解这个想法吗?
这是如何在计算机科学课程中教授的?
考虑
auto x = a + (b-a)*v;
Run Code Online (Sandbox Code Playgroud)
其目的是要建立在范围内的值[a,b)由系数v中[0,1.0).从纯数学的角度来看x>=a,和x<b.但是,我们如何证明或确保这适用于浮点?
a,b,v是同一类型的非负的有限浮点值(double或float)和b>a(最初称b>=a这是与我的要求明显不符x),和v<=netxtafter(1.0,0)(也就是说,它只是低于1.0).
这似乎是显而易见的,b-a >0因此(b-a)*v >=0我们不需要检查:
if (x<a) return a;
Run Code Online (Sandbox Code Playgroud)
但这也是多余的吗?
if (x>=b) return std::nextafter(b,a);
Run Code Online (Sandbox Code Playgroud)
可能编译器(优化)重写表达式来影响这些问题吗?浮点表示的类型是否输入?(我最感兴趣的是最常见的(iec559/IEEE 754).
我在Python(2.6.1)词典中遇到了一个奇怪的行为:
我的代码是:
new_item = {'val': 1.4}
print new_item['val']
print new_item
Run Code Online (Sandbox Code Playgroud)
结果是:
1.4
{'val': 1.3999999999999999}
Run Code Online (Sandbox Code Playgroud)
为什么是这样?它发生在一些数字上,但不是其他数字.例如:
我已经在我的c ++代码中得到了这个计算,
r=(float)736778906400/100现在很明显答案应该是7367789064,但编译器返回的7367789056是什么问题