C语言 数字字面值0.e0f的意思



我正在调试一个未初始化的内存错误。我现在遇到了数字文字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_ralpha_i的类型如何,普通的0都会更好

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

相关内容

  • 没有找到相关文章

最新更新