首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不调用未定义行为的情况下检查值是否符合类型?

如何在不调用未定义行为的情况下检查值是否符合类型?
EN

Stack Overflow用户
提问于 2022-04-01 11:00:11
回答 3查看 164关注 0票数 3

我希望检查一个double值是否可以表示为一个int (对于任何一对浮点(整数类型)都是相同的)。这是一种简单的方法:

代码语言:javascript
运行
复制
double x = ...;
int i = x; // potentially undefined behaviour

if ((double) i != x) {
    // not representable
}

但是,它在标记行上调用未定义的行为,并触发UBSan (有些人会抱怨)。

问题:

  • 认为这种方法一般可以接受吗?
  • 是否有一种不调用未定义行为的相当简单的方法?

应要求作出澄清:

我现在所面临的情况涉及到在C中从double转换到各种整数类型(intlonglong long)。然而,我以前也遇到过类似的情况,因此我对浮点数->整数和整数->浮点数转换的答案都感兴趣。

转换失败的例子:

3.5.

  • The
  • 浮点数整数转换可能失败是值不是一个整数,例如,源值可能超出目标类型的范围(大于或小于最大值和最小可表示值)。例如,1.23e100.
    • The源值可能是+-Inf或NaN,与之相比,NaN很棘手,因为它返回false.
    • Integer ->浮点数转换时,当浮点数类型没有足够的精度时,可能会失败。例如,典型的double有52个二进制数字,而64位整数类型有63个数字.例如,在典型的64位系统上,(long) (double) ((1L << 53) + 1L).
    • I确实理解1L << 53 (相对于(1L << 53) + 1)在技术上完全可以表示为double,并且我提议的代码将接受这种转换,尽管它可能不应该是我没有想到的?

EN

Stack Overflow用户

回答已采纳

发布于 2022-04-01 11:44:07

创建的范围限制与FP类型完全相同。

“诀窍”是在不放松精度的情况下形成限制。

让我们考虑floatint

floatint的转换是有效的(例如,32位2的补码int)对于-2,147,483,648.9999.到2,147,483,647.9999或者接近INT_MIN -1到INT_MAX + 1。

我们可以利用integer_MAX总是2-1的幂,而integer_MIN是-(2的幂)(用于一般2的补码).

避免FP_INT_MIN_minus_1的限制,因为它可能/可能不能完全编码为FP。

代码语言:javascript
运行
复制
// Form FP limits of "INT_MAX plus 1" and "INT_MIN"
#define FLOAT_INT_MAX_P1 ((INT_MAX/2 + 1)*2.0f)
#define FLOAT_INT_MIN ((float) INT_MIN)

if (f < FLOAT_INT_MAX_P1 && f - FLOAT_INT_MIN > -1.0f) {
  // Within range.
  
  Use modff() to detect a fraction if desired.
}

更多的迂腐代码将使用!isnan(f),并考虑非2的补码编码。

票数 1
EN
查看全部 3 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71705857

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档