3

我目前正在尝试调试未初始化的内存错误。我现在在 OpenBlas 源代码中遇到了数字文字 0.e0f(这是调试器当前所在的位置),这是什么意思?

上下文是这样的:

if ((alpha_r == 0.e0f) && (alpha_i == 0.e0f)) return;

0.e0f 显然评估为 0。

4

4 回答 4

5

浮点文字有两种语法。第一个由以下部分组成:

  • 包含小数点字符的非空十进制数字序列(定义有效数字)
  • (可选)e 或 E 后跟可选的减号或加号以及十进制数字的非空序列(定义指数)
  • (可选)作为 al、f、L 或 F 的后缀类型说明符

第二个由以下部分组成:

  • 十进制数字的非空序列(定义有效)
  • e 或 E 后跟可选的减号或加号以及十进制数字的非空序列(定义指数)
  • (可选)作为 al、f、L 或 F 的后缀类型说明符

后缀类型说明符定义了浮点字面量的实际类型:

  • (无后缀)定义双
  • f F 定义浮点数
  • l L 定义 long double
于 2014-07-16T10:04:48.710 回答
3

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。

于 2014-07-16T10:05:20.370 回答
0

它在科学计数法中为零,作为单精度浮点数,带有多余的小数点。这和 0e0 是一样的。

于 2014-07-16T10:06:48.317 回答
0

那是一种0类型float

请参阅 C99 标准中的 6.4.4.2 ( http://port70.net/~nsz/c/c99/n1256.html#6.4.4.2 )

在我看来,平原0会更好,无论类型alpha_ralpha_i

if ((alpha_r == 0) && (alpha_i == 0)) return;
于 2014-07-16T10:06:54.897 回答