我目前正在尝试调试未初始化的内存错误。我现在在 OpenBlas 源代码中遇到了数字文字 0.e0f(这是调试器当前所在的位置),这是什么意思?
上下文是这样的:
if ((alpha_r == 0.e0f) && (alpha_i == 0.e0f)) return;
0.e0f 显然评估为 0。
浮点文字有两种语法。第一个由以下部分组成:
第二个由以下部分组成:
后缀类型说明符定义了浮点字面量的实际类型:
f
浮点指标
eX
是 10 的 X 次幂的指数值。例如,e5
表示 10 到 5,即 100000。或e-3
表示 0.001。
将两者结合
1.23e-3f --> 1.23 x 10 ^ -3 = 0.00123
通过扩展您的示例,它是
0.e0f --> 0.0 x 10 ^ 0 = 0.0 (in floating point format)
PS:一个有用的编程实践。永远不要(参见 PS2)比较两个浮点数是否相等。
有些值不能用浮点数精确表示,只是近似值。像这个例子
0.3 + 0.6 = 0.89999999999999991 != 0.9
而是使用:
float a;
float b;
....
if( abs(a-b) < FLT_EPSILON )
FLT_EPLISON 是一个非常小的浮点值,其中 1.0 + FLT_EPSILON != 1.0
. (示例 0.1e-10)(引自 @AlterMann)
abs
是浮点绝对函数的缩写;在 std 中是fabs
. 也可以在其他具有不同名称的库中找到。
PS 2:好吧……从来没有这么坚强过。我并不是说这段代码在算法和语法上都是错误的。问题本身有点简单,尽管这个警告可能会帮助新的程序员在这里结束。
如评论中所述,此代码示例适用于检查。0 检查是有效的操作,因为当前的浮点表示标准保证可以表示 0。
它在科学计数法中为零,作为单精度浮点数,带有多余的小数点。这和 0e0 是一样的。
那是一种0
类型float
。
请参阅 C99 标准中的 6.4.4.2 ( http://port70.net/~nsz/c/c99/n1256.html#6.4.4.2 )
在我看来,平原0
会更好,无论类型alpha_r
和alpha_i
if ((alpha_r == 0) && (alpha_i == 0)) return;