【问题标题】:Is there any way to create a floating point number without using ldexp?有什么方法可以在不使用 ldexp 的情况下创建浮点数?
【发布时间】:2016-08-08 22:41:41
【问题描述】:

我正在尝试使用符号、指数和尾数创建一个 IEEE754 浮点数,但我似乎无法让 ldexp() 函数在我的计算机上运行,​​所以我想知道是否有办法创建通过直接操作位的值来获得该数字。

【问题讨论】:

  • 也许您应该问为什么不能使用ldexp 而不是尝试解决它。除非你的电脑很奇怪,否则使用 ldexp 应该没有问题。

标签: c++ ieee-754


【解决方案1】:

弄乱值表示的一个标准习惯用法是将您的位作为int 或char 数组的一部分,然后将memcpy() 放入您想要的类型。

请注意,通过写入 union 的一个字段并读取另一个字段或通过类型双关语(将指针从一种类型转换和取消引用到另一种类型,char* 除外)来完成您所要求的操作在技术上是未定义的行为C++ 标准,因此应该避免。众所周知,编译器会应用由于假设程序不执行这些行为而产生的优化,并且在执行时会导致意外行为。

对于此处考虑的指针转换的确切实例,Clang/LLVM 开发人员已在 a blog post 中发布,这是未定义的行为,他们可能会以意想不到的方式进行优化。

【讨论】:

  • 当您将位复制到浮点对象时,您知道这适用于您的编译器。 IE。你知道你的编译器。除非编译器不支持类型双关语,否则当编译器已知时,我认为没有理由不使用它。我宁愿不使用迫使我解决它缺乏对基本语言特性的支持的编译器。
  • 类型双关语和联合访问与上次编写的类型不同的类型是未定义的行为 - 该语言实际上邀请编译器做任何事情,他们确实做到了。请参阅blog.regehr.org/archives/959 和 Regehr 教授博客的其余部分,以深入探索该主题。
  • @Cheersandhth.-Alf 类型双关语(在某些类型中)和联合别名不是标准 C++ 的基本特性
  • 语言之外的东西没有章节和诗句。如果您声称它们使用的语言,您必须显示它们指定位置的 C&V。
  • 欢呼:offsetof 可能在某些实现中定义在库代码中,甚至可能使用如果用户代码包含它们显然会导致 UB 的构造(例如 arithmetic on a NULL pointer)。该标准只要求编译器使该构造按预期运行 - 它不要求模仿它的用户代码也能正常工作。
猜你喜欢
  • 2013-06-25
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 2021-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多