Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;不允许重新解释铸件的标准<;int>;(漂浮价值)?_C++_Floating Point - Fatal编程技术网

C++ C++;不允许重新解释铸件的标准<;int>;(漂浮价值)?

C++ C++;不允许重新解释铸件的标准<;int>;(漂浮价值)?,c++,floating-point,C++,Floating Point,或同等地 reinterpret_cast<int64>( aDoubleValue ) reinterpret_cast(一个超蓝) 允许这样的重新解释不会引入任何别名问题 我知道,使用memcpy将字节从一种类型的变量复制到另一种类型的变量可以达到必要的效果。我知道,成熟的编译器和强大的优化器可以用这样的memcpy结构完成美妙的事情 也就是说,我碰巧是一名编译器编写员。我非常清楚必须存在的许多优化形式,以及必须满足的许多先决条件,才能实现这些戏剧性的优化。我们真的想

或同等地

    reinterpret_cast<int64>( aDoubleValue )
reinterpret_cast(一个超蓝)
允许这样的重新解释不会引入任何别名问题

我知道,使用memcpy将字节从一种类型的变量复制到另一种类型的变量可以达到必要的效果。我知道,成熟的编译器和强大的优化器可以用这样的memcpy结构完成美妙的事情

也就是说,我碰巧是一名编译器编写员。我非常清楚必须存在的许多优化形式,以及必须满足的许多先决条件,才能实现这些戏剧性的优化。我们真的想假设每个编译器都那么强大,还是每个程序员都能成功地编写满足所有必要前提条件的代码?我们真的能指责使用非主流编译器的程序员怀疑这样一种希望的优化会发生吗

经常需要检查浮点值的位。我们真的想坚持每个程序员都遇到这样一个需要的变量:地址变量、char *异常、别名规则、MeMcPy魔术等等?< P/> < P> C++中提供的“新的”(现在相当老的)格式都是C风格转换的基本子集(“基本上”)。因为它们有一些小的补充,比如处理引用,这在C语言中是不存在的

要获得与C样式转换相当的reinterpret_转换,请执行以下操作:

int a = *(int *)&some_float;
因此,使用
reinterpret\u cast
,您可以做几乎相同的事情,只需使用
reinterpret\u cast
来更改cast本身的语法:

int a = *reinterpret_cast<int *>&some_float;
inta=*重新解释强制转换和一些浮点;

至于定义这一点,那么你可以在不违反任何严格的别名规则的情况下这样做:我怀疑委员会可能会乐意考虑一个很好的书面建议——我怀疑现在的问题是大多数人认为这会花费大量的工作,而回报将微乎其微。


如果真正的目的是支持查看浮点数的位,那么定义
bitset::bitset
的构造函数或按该顺序定义的东西可能会更简单,以提供一个已经显式定义的类型来访问位(尽管定义它应该如何以一种可移植的方式工作可能仍然很重要)。

如果您想要的只是一个将浮点转换为其位序列的函数,
memcpy
可以做到这一点,而不会违反严格的别名规则:

unsigned int ConvertFloat(float f)
{
  unsigned int ret;
  std::memcpy(&ret, &f, sizeof(unsigned int));
  return ret;
}

您甚至可以创建一个通用的模板函数,用于将一种类型转换为另一种类型。该函数将
static\u assert
或SFINAE检查参数是否可复制

在您的工作中,将浮点转换成整数是一种半频繁操作。但是对于大多数C++用户(或者大多数C用户)来说,这是不正确的。所以对于这种转换操作没有广泛的需求。


此外,C++标准不需要实现一个“代码<浮标< /COD> >的任何特定表示。因此,即使标准提供了这样的函数,它也不能告诉它它实际上返回了什么。甚至不能保证<代码>浮点< /C> >可以符合<代码>未签名的int < /代码>。< /P>您是否尝试过这个?指向该值的指针?“经常需要检查浮点值的位。”我很好奇你在做什么,你需要“经常”这样做。@NicolBolas我是一家公司的编译器编写员,该公司在数学库方面投入了大量资金。无论是在优化器对浮点函数的抽象解释方面,还是在我们的数学库的实现方面,我通常都必须克服IEEE标准中+0.0等于-0.0的概念。能够比较已知的浮点值作为整数的“零的某种味道”比提取符号位的代码更有效,特别是当指令集直接支持它时(例如x86的SSE)。我很乐意使用返回原始位的std函数。我喜欢位集的概念-明确的语义/服务目的,不会导致类型滥用。@Nicolas:你认为我没有意识到吗?如果是,你认为“不违反任何严格的别名规则”指的是什么?此外,C++标准不需要实现浮点的任何特定表示。因此,即使标准提供了这样的函数,它也不能告诉它它实际上返回了什么。甚至不能保证浮点可以适合于未签名int。"考虑到标准在解释整数类型和指针之间的转换时会遇到很多麻烦,这似乎是一个很弱的论据。@JohnYates:标准对整数/指针转换的最大说明是,如果整数足够大,可以容纳它,那么可以将该整数转换为back并获取相同的指针(空指针变为零,反之亦然)。除此之外,它什么也没说。甚至不能保证实现必须支持足够大的整数类型来容纳指针值(intptr\t是可选的)。有些非规范性文本关于该值并不打算“令人惊讶”,但这并不意味着行为方面的任何问题。我想你刚刚阐明了我的观点。在我看来,你之前关于浮点数据类型和整数类型的相对大小的评论似乎与标准中关于指针类型大小的观点完全一致。我很高兴对浮点数据的承诺同样微弱。