【问题标题】:What does the numerical literal 0.e0f mean?数字文字 0.e0f 是什么意思?
【发布时间】:2014-07-16 10:00:01
【问题描述】:

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

上下文是这样的:

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

0.e0f 显然计算为 0。

【问题讨论】:

  • 如果我没记错的话,0.e0f 是浮点数表示中的零(或非常接近零的东西)。这只是一个猜测......你的编译命令中有 -lm 选项吗?

标签: c literals openblas


【解决方案1】:

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

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

第二个由以下部分组成:

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

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

  • (无后缀)定义双精度
  • f F 定义浮点数
  • l L 定义 long double

【讨论】:

    【解决方案2】:

    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:好的……从来没有这么坚强过。我并不是说这段代码在算法和语法上都是错误的。问题本身有点简单,虽然这个警告可能会帮助新的程序员在这里结束。

    正如 cmets 所述,此代码示例适用于检查。 0 检查是一个有效的操作,因为当前的浮点表示标准保证 0 可以表示。

    【讨论】:

    • +1,说得好,可以说FLT_EPSILON 是满足 1.0 + FLT_EPSILON != 1.0 的最小正数。 if( abs(a-b) &lt; FLT_EPSILON ) 似乎是更好的选择
    • 说“从不”太过分了。将浮点数与 0 进行比较可能是有效的,例如在一个循环中,您将浮点数减少一个常数因子,以便它将变为 0。此外,您的首选解决方案有时与比较相等性相同(例如,当两个数字都大于 4)并且有时不太可能有用(例如,当两个数字本身都小于 FLT_EPSILON 时)。最后,我认为是一个错字;它应该是 fabsf,而不是 abs。
    • 实际上在你的例子中你应该省略浮动指针比较。积分运算更可能导致数值差异。 counter 的某些中间值可能无法用浮点数表示。与 0 进行比较是可以接受的,但我仍然认为这是一种更好的做法。所需的操作是 if 表现为平等。 FLT_EPSILON 取决于您的架构和应用程序。这就是浮点数对于检查相等性很危险的原因。 abs 是缩短 absolute 不表示库函数但也更好地声明。
    • 在这种情况下,比较相等是绝对正确的。有问题的代码是测试复数alpha 是否为零(意味着真正的零,而不是“排序零”或“有点小”)。使用任何涉及公差的近似比较都是一个错误。
    • 更正代码来自 OpenBlas,所以任何不是真正零的东西都会导致进行一些计算,据我所知,这是期望的结果。
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      这是0 类型的float。

      参见 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;
      

      【讨论】:

        猜你喜欢
        • 2013-05-28
        • 2011-06-10
        • 1970-01-01
        • 2015-03-20
        • 2020-01-07
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 2018-09-10
        相关资源
        最近更新 更多