固定大小的浮点类型

Pie*_*tro 82 c c++ floating-point boost

stdint.h(C99),boost/cstdint.hppcstdint(C++ 0x)标题中,除其他外,还有类型int32_t.

是否有类似的固定大小浮点类型?有点像float32_t

Ste*_*non 42

目前在C或C++标准中不存在这样的情况.事实上,甚至根本没有保证float二进制浮点格式.

一些编译器保证该float类型将是IEEE-754 32位二进制格式.有些人没有.实际上,float实际上single大多数非嵌入式平台上都是 IEEE-754 类型,尽管有些编译器以更广泛的格式评估表达式的常见警告适用.

有一个工作组正在讨论为2008版IEEE-754添加C语言绑定,可以考虑建议添加这样的typedef.如果将它添加到C中,我希望C++标准最终会效仿.

  • 通过阻止您的代码在许多小众架构上进行编译,您将如何获得更好的*可移植性?要么你依赖于浮点运算是IEEE,在这种情况下你的代码将*已经*运行在每个符合IEEE标准的实现上,没有别的,或者你没有,在这种情况下你的代码将运行在更广泛的系统上.如果C++*保证符合IEEE标准,那么您的代码不会神奇地变得更加可移植,您只能排除它可以*在这些不兼容的体系结构上运行.你的逻辑是完全倒退的. (7认同)
  • 无论IEEE-754与否,它仍然不会阻止端点可移植性问题. (2认同)
  • @Potatoswatter:这将鼓励硬件供应商提供合规的解决方案。如果 a 部分支持标准 C,而不需要软浮点库修改,而 b 部分则不需要,那么 a 部分就具有市场优势。 (2认同)
  • @Potatoswatter :(几乎)没有人关心硬件的速度.我们关心硬件上运行的软件的速度.如果运行的硬件符合标准,软件可以更快,软件根据运行的平台不需要检测和修补15种不同的特殊情况. (2认同)

Pot*_*ter 28

如果您想知道您float的IEEE 是否为32位,请检查std::numeric_limits<float>::is_iec559.它是编译时常量,而不是函数.

如果你想要更加防弹,还要检查std::numeric_limits<float>::digits以确保它们不会偷偷地使用IEEE标准的双精度float.它应该是24.

说到long double这一点,更重要的是要检查,digits因为有几种IEEE格式可能是合理的:128位(数字= 113)或80位(数字= 64).

这样做是不切实际的,float32_t因为您通常希望使用浮点硬件(如果可用),而不是依赖于软件实现.


小智 16

如果你认为像float32_t和float64_t这样的typedef由于任何原因都是不切实际的,你必须习惯于熟悉的操作系统,编译器,以至于你无法看到你的小窝之外.

存在本机运行32位IEEE浮点运算的硬件和其他运行64位的硬件.有时这样的系统甚至不得不互相交谈,在这种情况下,知道每个平台上的双精度是32位还是64位是非常重要的.如果32位平台基于另一个64位值进行过多计算,我们可能希望根据时序和速度要求转换为较低的精度.

我个人觉得使用浮子和双打感觉不舒服,除非我确切知道他们在我的平台上有多少位.如果我通过某些通信渠道将这些转移到另一个平台,那就更是如此了.


Nul*_*ion 11

C++23 中引入了符合 IEEE 754 的固定精度浮点数。

以下是实例化 64 位浮点数的方法:

#include <stdfloat>
int main()
{
    std::float64_t f = 0.1f64;
}
Run Code Online (Sandbox Code Playgroud)

实施建议可以在这里找到