对于C中的整数常量,科学记数法是否安全?

Dav*_*sky 35 c c++ gcc

有一段时间,我一直用科学记数法表示常量中10的大功率,所以我不需要计算零.例如

#define DELAY_USEC 1e6
Run Code Online (Sandbox Code Playgroud)

一位同事指出这不安全,因为它不是一个整数,并且不能保证总是完全等于1000000 .文档似乎证实了这一点,但我想知道它的实用性是否真实.有没有办法用速记安全地声明十次幂的整数?将它强制转换为定义中的int是否安全?

Mik*_*our 21

从理论上讲,没有.两种语言都没有指定如何表示浮点值,或者哪些值可以精确表示.(更新:显然,C11确实推荐一种表示法.C++和旧的C方言,不要).

在实践中,是的,对于相当大的价值范围.任何实现你远程可能会遇到将使用64位IEEE表示double.这可以精确地表示高达2 53(大约9x10 15)的任何整数值.它当然可以代表32位整数类型所代表的任何东西.

  • C11 5.2.4.2.2确实规定了一些限制.例如,`double`必须能够保存任何带有10位十进制数的整数. (3认同)

Pau*_*ans 8

您想要使用用户定义的文字:

constexpr long long operator "" _k(long long l) {
    return l * 1000;
}

constexpr long long operator "" _m(long long l) {
    return l * 1000 * 1000;
}
Run Code Online (Sandbox Code Playgroud)

然后你可以简单地做:

long long delay = 1_m;
long long wait = 45_k;
Run Code Online (Sandbox Code Playgroud)

  • @MartinBa:是的,你是对的; `_M`是不允许的.我不应该这样说. (3认同)
  • 但是你要把它们称为`_k`和`_m`,因为没有前导下划线的文字名称是保留的.您可能还希望`_M`而不是`_m`匹配SI前缀. (2认同)

tmy*_*ebu 8

你具体问十个权力. 1e6将是一百万.你可以在1e22没有任何不良事件的情况下前进.但请注意,在C++和C中,1e6都是double常量,而不是整数常量.

十个负面的力量是一个不同的故事. 1e-1与所有低权力一样,是不精确的.

  • @tmyklebu:很公平,我没有注意到这个限制.可能值得澄清答案,以防我不是唯一一个没有完整背景的人. (3认同)
  • C不保证这一点,IEEE做的 (2认同)