我正在调试一个未初始化的内存错误。我现在遇到了数字文字0。OpenBlas源代码中的e0f(这是调试器当前所在的位置)这意味着什么?
上下文是这样的:
if ((alpha_r == 0.e0f) && (alpha_i == 0.e0f)) return;
0。E0f的结果显然是0
浮点字面值有两种语法。第一个由以下部分组成:
- 包含小数点字符(定义有效)的非空十进制数字序列
- (可选)e或e后面跟着可选的减号或加号和非空的十进制数字序列(定义指数)
- (可选)后缀类型说明符,如l、f、l或f
第二部分由以下部分组成:
- 非空的十进制数字序列(定义有效)
- e或e后跟可选的减号或加号和非空的十进制数字序列(定义指数)
- (可选)后缀类型说明符,如l、f、l或f
后缀类型说明符定义了浮点字面值的实际类型:
- (无后缀)定义双
- f f定义float
- l l定义长双精度
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: OK…我从来没有一点点坚强过。我并不是说这段代码在算法和语法上都是错误的。问题本身有点简单,但这个警告可能会帮助新程序员在这里结束。
如注释所述,此代码示例适合进行检查。0检查是一个有效的操作,因为当前的浮点表示标准保证0可以被表示。
在科学记数法中为零,作为单精度浮点数,带有一个冗余的小数点。和0e0是一样的
这是float
类型的0
。
见C99标准6.4.4.2 (http://port70.net/~nsz/c/c99/n1256.html#6.4.4.2)
在我看来,无论alpha_r
和alpha_i
的类型如何,普通的0
都会更好
if ((alpha_r == 0) && (alpha_i == 0)) return;