【发布时间】:2014-09-27 03:09:47
【问题描述】:
我不想在不精确的值会造成灾难时引入浮点,所以我有几个问题是关于何时可以安全地使用它们。
只要不溢出有效数字的数量,它们对整数是否准确?这两个测试是否总是正确的:
double d = 2.0;
if (d + 3.0 == 5.0) ...
if (d * 3.0 == 6.0) ...
您可以依赖哪些数学函数?这些测试是否总是正确的:
#include <math.h>
double d = 100.0;
if (log10(d) == 2.0) ...
if (pow(d, 2.0) == 10000.0) ...
if (sqrt(d) == 10.0) ...
这个怎么样:
int v = ...;
if (log2((double) v) > 16.0) ... /* gonna need more than 16 bits to store v */
if (log((double) v) / log(2.0) > 16.0) ... /* C89 */
我想您可以将这个问题总结为:1) 浮点类型能否将所有整数的精确值保存到 float.h 中的有效数字位数? 2) 是否所有浮点运算符和函数都保证结果与实际数学结果最接近?
【问题讨论】:
-
在 Wikipedia 和网络上的其他地方有一些关于浮点的非常好的文章。您应该阅读其中的一些内容。
-
整数值被精确存储,直到某个最大值。第一个块将完全按照您期望的方式进行评估。我不知道你其他问题的答案。附言整数的最大值将略小于有效位数。
-
@MarkRansom - 整数是精确的在 IEEE 浮点数中。这可能不适用于其他浮点格式,C 没有指定要使用的浮点格式。
-
@HotLicks 这就是为什么我按照我的方式措辞,没有指定确切的值或位数。您是否知道 任何 浮点格式,无论多么晦涩难懂,都不能保存精确的整数?
标签: c floating-point