C/C++中的固定宽度浮点数

Ima*_*ist 21 c c++ floating-point double

int通常是32位,但在标准中,int并不保证具有恒定的宽度.因此,如果我们想要32位,int我们包括stdint.h并使用int32_t.

对于花车有没有相同的东西?我意识到浮点数有点复杂,因为它们不是以同类方式存储的,即符号,指数,有效数.我只想要一个double保证以64位存储1个符号位,10位指数和52/53位有效位(取决于你是否计算隐藏位).

Mic*_*sen 6

根据目前的C99标准草案,附件F,应该是双倍的。当然,这是假设您的编译器满足标准的该部分。

对于 C++,我检查了 0x 草案和 1998 版本标准的草案,但似乎都没有指定任何有关 C99 标准的那部分表示的内容,除了 numeric_limits 中指定 IEEE 754/IEC 559 的 bool 之外正如 Josh Kelley 提到的那样,在该平台上使用。

不过,很少有平台不支持 IEEE 754 - 设计另一种浮点格式通常不会有回报,因为 IEEE 754 定义明确并且工作得很好 - 如果支持,那么可以合理地假设将确实是 64 位(毕竟 IEEE 754-1985 称这种格式为双精度,所以这是有道理的)。

如果 double 不是双精度,请构建健全性检查,以便用户可以报告它,并且您可以单独处理该平台。如果平台不支持 IEEE 754,那么除非您自己实现,否则您将无法获得该表示形式。


Jos*_*ley 6

虽然我不知道哪种类型可以保证特定的大小和格式,但在 C++ 中确实有一些选择。您可以使用<limits>标头及其std::numeric_limits类模板来找出给定类型的大小,std::numeric_limits::digits告诉您尾数中的位数,并std::numeric_limits::is_iec559告诉您该类型是否遵循 IEEE 格式。(有关在位级别操作 IEEE 数字的示例代码,请参阅 Google Test 的gtest-internal.h中的 FloatingPoint 类模板。)