我正在为基本类型编写类,这样在多个平台和编译器上的代码在逻辑上是相同的(比如intint_least16_t).为了好玩!(我还是个学生.)

float [...] Matches IEEE-754 binary32 format if supported.

更糟糕的是:

Floating-point types MAY support special values: , NaN or -0

这意味着float可能是无符号的...

我知道这就像__int128,标准只是一个标准,

据我所知,浮动是强制性的(不像int16_t那样是可选的),


我们只有一些宏(<cfloat>):

  • FLT_MINFLT_MAX-即使是FLT_MIN = IEEE-754::FLT_MIN,浮点也可以是非IEEE-754.

  • FLT_RADIX基系统?如果是这样,可以帮助写下确切的值.不过,float可以是3位或200位(大小)...

  • FLT_EPSILON-(从1到下一个)我们可以使用它(带基数)来判断分数大小...

  • FLT_MANT_DIG-是"尾数"数字/分数大小吗?

  • FLT_MAX_EXP-指数填充1...在IEEE-754中,

如果float类似于IEEE-754(符号、指数、分数),那么它很简单,

我看到的唯一出路是向编译器中添加宏.

我知道这是一个理论问题,但我感兴趣的是,当我们使用float关键字时,是否有任何可能的判断,或者我们都编写依赖于实现的代码?

推荐答案

在C++中,对于所有浮点类型T "if, and only if, the type adheres to ISO/IEC/IEEE 60559"std::numeric_limits<T>::is_iec559的值应为true,ISO/IEC/IEEE 60559:2011与IEEE 754-2008相同,因此:

#include <iostream>
#include <limits>

int main() {
    std::cout << std::boolalpha << std::numeric_limits<float>::is_iec559 << '\n';
}

注:如 comments 中所述,尽管某些实现的浮点类型未严格遵循IEEE 754-2008标准,但对于该恒定事件,可能仍报告true.

例如,在gcc中,您可以使用选项-Ofast-ffast-math进行编译,选项-Ofast-ffast-math反过来设置了许多选项,这可能会导致程序的输出不正确,这些程序依赖于数学函数的IEEE或ISO规则/规范的精确实现.

C++相关问答推荐

在32位处理器上优化53—32位模计算>

C:二进制搜索和二进制插入

在C中将通用字符名称转换为UTF-8

不会停在空格或换行符上的错误

在编译时参数化类型定义

为什么net/if.h在ifaddrs.h之前?

在C语言中,在数学运算过程中,为什么浮点数在变量中的行为不同

使用双指针动态分配和初始化2D数组

C++中矢量类型定义和数据保护的高效解决方案

从uint8_t*转换为char*可接受

S的这种管道实施有什么问题吗?

我不知道为什么它不能正常工作,我用了get()和fget(),结果是一样的

程序如何解释变量中的值

C 和 C++ 标准如何告诉您如何处理它们未涵盖的情况?

将指针的地址加载到寄存器内联拇指组件中

保存有符号整数结果的变量是否会溢出(后增量的副作用),并且此后从未在任何表达式中使用过它,是否会导致 UB?

如何向 execl 创建的后台程序提供输入?

在 C23 之前如何对空指针使用nullptr?

C23 中的 [[reproducible]] 和 [[unsequenced]] 属性是什么?什么时候应该使用它们?

当循环变量在溢出时未定义时,可以进行哪些优化?