双0.0是否总是在便携式C中完全表示?

kir*_*kun 2 c c++ bit-representation inexact-arithmetic

是否可以在具有符合ANSI标准的C编译器的所有环境中使用以下代码?

double n = 0;
assert(n == 0);
Run Code Online (Sandbox Code Playgroud)

那么C++呢?

Ste*_*non 5

你不是在问是否0.0总能完全代表.

在语句中assert(n == 0),在比较发生之前0转换为double.因此,如果转换只能触发断言0来自intdouble不可再现.这比你问什么弱得多的限制,几乎肯定会举行(虽然我想不出一个标准参考的,以保证它把我的头顶部).

对于您打算提出的问题:

正如其他人所提到的,C标准并不要求浮点类型映射到IEEE-754,但我不知道任何C编译器使用的浮点表示没有精确的零表示.也就是说,对于C实现而言,使用一种格式double并不完全为零是"合法的" .


caf*_*caf 5

C标准确实对浮点值的表示方式施加了一些限制.在§5.2.4.2.2浮点类型的特征中,浮点数必须表现出类似于模型定义的特征:

X = SB ë Σ K = 1..p ˚F ķ b -k

哪里:

  • s是标志,必须是±1;
  • b是基数,且必须是> 1的整数;
  • e是指数,必须是e min和e max之间的整数;
  • p是精度; 和
  • f k是非负整数< b - 有效数字的数字.

在这个模型下,零总是能够精确表示 - 它只需要所有有效数字f k为零.

鉴于§6.3.1.4中的以下限制:

当整数类型的值转换为实际浮动类型时,如果正在转换的值可以在新类型中准确表示,则它将保持不变.

因此,当从整数0转换为浮点类型时,零必须始终保持不变.因此断言必须始终坚持.