【问题标题】:Does IEEE-754 float, double and quad guarantee exact representation of -2, -1, -0, 0, 1, 2?IEEE-754 float、double 和 quad 是否保证 -2、-1、-0、0、1、2 的精确表示?
【发布时间】:2013-11-30 12:29:27
【问题描述】:

一切都在标题中:IEEE-754 floatdoublequad 是否保证 -2-1-001、@987654331 的精确表示@?

【问题讨论】:

  • 你是指这六个值,还是一般的整数?
  • Read about the format,并尝试在纸上创造这些价值。
  • 顺便说一句,你可以玩得开心here(虽然不是“四人组”)

标签: c++ c floating-point ieee-754 floating-point-precision


【解决方案1】:

它保证所有整数的精确表示,直到有效二进制位数超过尾数范围。

【讨论】:

  • 是的,但是没有-0的整数概念。
  • @AkiSuihkonen:也许学究式地,二进制补码整数表示是正确的,但不是二进制补码,负零确实有表示。
  • @AkiSuihkonen 无关紧要。这不是被问到的,也不是我回答的。这是一个相反方向的映射。
【解决方案2】:

获取任何十进制数答案的简单方法,将绝对值转换为二进制(浮点数为 24 位,双精度数为 53 位,四进制数为 113 位),然后返回十进制,然后查看如果你得到相同的价值。

对于整数,答案很明显,你不会丢失任何东西,除非值太大而无法容纳给定的位数。

有理值与非整数部分的转换更有趣。在转换为具有一定宽度的二进制时,您可能会失去精度,而在转换回十进制时,您可能会得到一个带有周期性十进制扩展的十进制值(或者如果四舍五入,则会再次失去精度)。


既然您正在涉足 IEEE 浮点数,请先阅读 the wikipedia page,然后当您觉得您已准备好更多内容时,请继续阅读此处的第一个外部链接,"What Every Computer Scientist Should Know About Floating-Point Arithmetic"

【讨论】:

  • 24, 53113 请!
  • @MarkDickinson 谢谢,很好!而对于其他人来说,原因是隐含的 1 位,因为这是浮点值,并且浮点小数点总是可以移动,所以最左边的位是 1(所谓的 规范化 值),并且由于它始终为 1(0 除外),因此无需在其上浪费宝贵的一点。
【解决方案3】:

IEEE 754 浮点数可用于精确存储特定范围的整数。例如:

  • binary32,在 C/C++ 中实现为 float,提供 24 位精度,因此可以用全精度 16 位整数表示,例如short int;
  • binary64,在 C/C++ 中实现为 double,提供 53 位精度,可以精确表示 32 位整数,例如int;
  • 非标准 Intel 80 位精度,由一些 x86/x64 编译器实现为long double,提供 64 位有效位并且可以表示 64 位整数,例如long int(在 LP64 系统上,例如 Unix)或 long long int(在 LLP64 系统上,例如 Windows);
  • binary128,实现为特定于编译器的类型,例如 __float128 (GCC) 或 _Quad (Intel C/C++),在尾数中提供 113 位,因此可以精确地表示 64 位整数。

double 适合扩展的整数范围,甚至超过 32 位整数的范围,这一事实用于 JavaScript,它没有特殊的整数数值类型,而是 uses double precision floating-point to represent integers

浮点数的一个怪癖是它们具有单独的符号位,因此存在正零和负零之类的东西,这在二进制补码有符号整数表示中是不可能的。

【讨论】:

    猜你喜欢
    • 2013-11-05
    • 2022-08-14
    • 2021-01-26
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多