【发布时间】:2019-11-06 21:59:34
【问题描述】:
假设I 是某个整数类型,F 是某个(实)浮点类型。
我想写两个函数。第一个函数应采用I 类型的值i 并返回一个布尔值,指示转换为F 的i 是否属于可表示范围,即(F)i 是否具有已定义的行为。
第二个函数应取F 类型的值f 并返回一个布尔值,指示转换为I 的f 是否属于可表示范围,即(I)f 是否将具有已定义的行为。
是否有可能编写这样一个函数,在每个符合标准的实现上,对任何输入都是正确的并且不会表现出未定义的行为?特别是我不想假设浮点类型是 IEEE 754 类型。
我分别询问 C 和 C++ 以及它们各自的标准版本,以防改变答案。
基本上,这个问题的目的是在完全不依赖 IEEE 754 或其他标准或硬件细节的情况下确定(明智的)浮点/整数转换是否可行。我好奇地问。
与例如比较INT_MAX 或 FLT_MAX 似乎是不可能的,因为在不知道哪种类型的范围更广的情况下,不清楚在哪种类型中进行比较。
【问题讨论】:
-
std::numeric_limits应该为您提供所有您需要知道的值是否可转换的信息(需要计算)。 -
@NathanOliver-ReinstateMonica 我不确定我应该使用什么进行比较。正如我所提到的,我认为我无法与
max进行比较,因为这已经需要将操作数转换为该类型,这可能是不可能的。我可以将整数的 log2 与max_exponent进行比较,但我不确定当它们比较相等时我能得出任何结论。 -
@GreenTree 谢谢,我一定是搜索了错误的术语。这个问题和其他相关的问题似乎是重复的。不过,我仍然需要详细阅读它们。
-
只进行双向转换并检查是否相等有什么问题吗?我很难想到会失败的案例。
标签: c++ c language-lawyer