提问人:Pietro 提问时间:3/27/2010 最后编辑:WhymarrhPietro 更新时间:11/22/2023 访问量:69866
固定大小的浮点类型
Fixed-size floating point types
问:
在 (C99)、boost/cstdint.hpp 和 (C++0x) 标头中,类型为 .stdint.h
cstdint
int32_t
是否有类似的固定大小浮点类型?像这样的东西 ?float32_t
答:
目前在C或C++标准中不存在这样的东西。事实上,甚至不能保证会是二进制浮点格式。float
某些编译器保证类型为 IEEE-754 32 位二进制格式。有些则不然。实际上,在大多数非嵌入式平台上,IEEE-754 类型实际上都适用,尽管一些编译器以更广泛的格式评估表达式的通常警告适用。float
float
single
有一个工作组正在讨论为 IEEE-754 的 2008 年修订版添加 C 语言绑定,该工作组可以考虑建议添加这样的 typedef。如果将其添加到 C 中,我希望 C++ 标准也会效仿......最终。
评论
如果您想知道 your 是否为 IEEE 32 位类型,请选中 。它是一个编译时常量,而不是一个函数。float
std::numeric_limits<float>::is_iec559
如果您想更加防弹,还要检查以确保他们没有偷偷地使用 IEEE 标准的双精度。它应该是 24。std::numeric_limits<float>::digits
float
当涉及到 时,检查更为重要,因为有几种 IEEE 格式可能是合理的:128 位(数字 = 113)或 80 位(数字 = 64)。long double
digits
这样做是不切实际的,因为您通常希望使用浮点硬件(如果可用),而不是依靠软件实现。float32_t
评论
long double
5.0L
a000000000000000
3fff
4001
00 00 00 00 00 00 00 a0 01 40
4001
01 40 00 00 ...
a0 01 40
a0
01 40
如果你认为拥有 float32_t 和 float64_t 等 typedef 出于任何原因都是不切实际的,那么你一定太习惯了你熟悉的操作系统、编译器,以至于你无法超越你的小巢穴。
存在本机运行 32 位 IEEE 浮点运算的硬件和其他执行 64 位运算的硬件。有时,此类系统甚至必须相互通信,在这种情况下,了解每个平台上的双精度是 32 位还是 64 位非常重要。如果 32 位平台要根据另一个平台的 64 位值进行过多的计算,我们可能希望根据时序和速度要求转换为较低的精度。
我个人对使用浮点数和双打感到不舒服,除非我确切地知道它们在我的平台上有多少位。如果我要通过某些通信渠道将这些传输到另一个平台,则更是如此。
评论
目前有人提议将以下类型添加到语言中:
decimal32
decimal64
decimal128
也许有一天可以通过 .#include <decimal>
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html
评论
decimal24
C++23 中引入了符合 IEEE 754 的固定精度浮点数。
以下是实例化 64 位浮点数的方法:
#include <stdfloat>
int main()
{
std::float64_t f = 0.1f64;
}
实施建议可以在这里找到
评论
std::float64_t
评论
sizeof
sizeof