C语言 固定大小浮点类型

yrwegjxp  于 2023-05-16  发布在  其他
关注(0)|答案(5)|浏览(133)

stdint.h(C99)、boost/cstdint.hppcstdint(C++0x)头文件中,除其他外,还有int32_t类型。
是否有类似的固定大小浮点类型?比如float32_t

wa7juj8i

wa7juj8i1#

目前,在C或C标准中还没有这样的东西。事实上,根本不能保证float是二进制浮点格式。
一些编译器保证float类型将是IEEE-754 32位二进制格式。有些人则不然。实际上,float实际上是 * 大多数 * 非嵌入式平台上的IEEE-754 single类型,尽管一些编译器以更广泛的格式计算表达式的常见警告适用。
有一个工作组正在讨论为IEEE-754的2008修订版添加C语言绑定,该工作组可以考虑建议添加这样的typedef。如果这被添加到C中,我希望C
标准也会效仿...最终会的

ezykj2lf

ezykj2lf2#

如果您想知道float是否是IEEE 32位类型,请检查std::numeric_limits<float>::is_iec559。它是一个编译时常量,而不是一个函数。
如果您想更安全,还可以检查std::numeric_limits<float>::digits,以确保它们没有偷偷地使用float的IEEE标准双精度。应该是24。
当涉及到long double时,检查digits更重要,因为有几种IEEE格式可能是合理的:128位(数字= 113)或80位(数字= 64)。
使用这样的float32_t是不实际的,因为您通常希望使用浮点硬件(如果可用),而不是依靠软件实现。

ua4mk5z4

ua4mk5z43#

如果你认为拥有float32_t和float64_t这样的类型定义是不切实际的,那么你一定是太习惯于你熟悉的操作系统,编译器,以至于你无法跳出你的小巢。
存在本机运行32位IEEE浮点运算的硬件和执行64位运算的其他硬件。有时候,这样的系统甚至必须互相通信,在这种情况下,知道每个平台上的double是32位还是64位是非常重要的。如果32位平台要基于另一个平台的64位值进行过多的计算,我们可能需要根据时序和速度要求转换为较低的精度。
我个人觉得使用浮点数和双精度浮点数很不舒服,除非我确切地知道它们在我的平台上有多少位。如果我要通过一些通信渠道将这些传输到另一个平台,情况就更是如此。

j2cgzkjk

j2cgzkjk4#

目前有一个建议是将以下类型添加到语言中:

decimal32
decimal64
decimal128

其有一天可以通过#include <decimal>访问。
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n3871.html

ecr0jaav

ecr0jaav5#

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

下面是如何示例化一个64位float:

#include <stdfloat>
int main()
{
    std::float64_t f = 0.1f64;
}

实施方案可以在here中找到

相关问题