为什么不使用基于二进制补码的浮点?

2024-01-22

float64、32 和 16 的 IEEE 754 标准使用有符号尾数和有偏差指数。作为一名设计硬件架构的学生,对我来说,对有效数和指数部分使用二进制补码更有意义。

例如,定义 32 位(半精度)浮点数,第一位表示符号,接下来的 8 位 - 指数(偏置 127),最后 23 位表示尾数。为了实现(负数)加法/乘法,我们需要将尾数转换为二进制补码并反之。由此产生的硬件相当复杂。

相反,请考虑前 8 位是否表示指数,后 24 位是否表示尾数,两者均采用二进制补码。位移、加法和乘法相对简单,硬件也不太复杂。此外,我们还有一个唯一的零表示有效数字(两个零表示有符号位)

我花了几个月的时间寻找这些设计决策的原因,并发现了这些:

  1. 2 的补码表示法更难比较。

确实如此,我们需要一个加法器(减法器)来比较 2 的补码。然而,对于诸如 GPU 和我自己的基于 FPGA 的 CNN 加速器等流水线架构,我们需要避免可变延迟。迭代地逐位比较有符号表示使得无法预先确定延迟。在我看来,在这种情况下,减法更好。

  1. 历史原因:处理 NAN 和 infs

也许我们可以为此分配一两个位。并将有效数设为 23 位。

  1. +0 和 -0 为零,因此 1/+0 = +inf 且 1/-0 = -inf

现在这是一个正当的理由。它并不真正适用于我的用例,但我想知道如果他们用额外的位来实现这一点是否会更好。

我的用例

我正在 FPGA 上构建 CNN 加速器。预定义乘法和加法延迟以及最小化硬件复杂性对我来说至关重要。我不执行除法,也不必担心 infs 和 NAN。

因此,我决定使用如上所述的二进制补码表示形式来使用浮点的自定义内部表示形式。有什么明显的缺点需要我注意吗?


这是一个经过深入研究的话题are使用 2 的补码浮点表示的系统;通常是 IEEE-754 之前的版本,尽管最近的版本也可用。有关此类系统特性的研究,请参阅本文:https://hal.archives-ouvertes.fr/hal-00157268/document https://hal.archives-ouvertes.fr/hal-00157268/document

Kahan 本人(IEEE754 标准的设计者)确实认为,单独的 +/-0 对于浮点通常使用的近似值很重要,其中浮点 0 结果本质上是正还是负很重要。看https://people.freebsd.org/~das/kahan86branch.pdf https://people.freebsd.org/%7Edas/kahan86branch.pdf了解详情。

所以,是的:完全有可能有 2 的补码浮点数;但标准选择了符号大小表示。无论你选择哪一个,有些操作会很容易,有些操作会比较困难;对比最明显。当然,如果您正在设计自己的硬件,没有什么可以阻止您选择最适合您需求的表示形式!特别是,您甚至可以使用所谓的 unum 和 posit ,其中指数和有效数部分不是固定大小,而是取决于您在范围内的位置。看这里:https://www.johndcook.com/blog/2018/04/11/anatomy-of-a-posit-number/ https://www.johndcook.com/blog/2018/04/11/anatomy-of-a-posit-number/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么不使用基于二进制补码的浮点? 的相关文章

  • C 中浮点数的比较

    我有一个double打印为0 000000我试图将其与0 0f 不成功 为什么这里有区别呢 确定双精度数是否为零的最可靠方法是什么 确定它是否足够接近零以将其打印为0 000000精确到小数点后六位 例如 fabs d lt 0 00000
  • 用于浮点和整数验证的 JavaScript

    我尝试创建一个 javascript 函数validate integer values从文本框 验证它的最佳方法是什么 以便仅integer and float值可以接受吗 数字验证所需的 javascript 函数 remove whi
  • _ftol2_sse,有更快的选择吗?

    我有调用很多的代码 int myNumber int floatNumber 这总共占用了我大约 10 的 CPU 时间 根据分析器 虽然我可以就这样 但我想知道是否有更快的选择 所以我尝试四处搜索 并偶然发现 http devmaster
  • 如何使用 cout 以全精度打印双精度值?

    In my 先前的问题 https stackoverflow com questions 553974 why does int55 54 in c我正在打印一个double using cout当我没有预料到的时候 它就被四舍五入了 我
  • 浮点转换和性能

    我知道在浮点数和整数之间进行转换时可能会出现错误 但是性能如何 请忽略准确性问题 一般来说 如果我对不同算术类型的操作数 即不同的浮点类型 例如 float and double 和浮点 整数类型组合 例如float and int 是否存
  • C++ 将浮点数转换为无符号字符?

    我是 C 新手 我想做了一些谷歌搜索sprintf可以完成这项工作 但是编译时出现错误 无法在unsigned char and a char 我需要一个无符号字符 因为我要打印到图像文件 0 255 RGB unsigned char p
  • 在matlab中设置图例符号的精度

    我有这个 leg2 strcat Max Degree num2str adet 1 1 ch l leg3 strcat Min Degree num2str adet 1 2 ch l leg4 strcat Max Request n
  • IEEE-754 32 位(单精度)指数 -126 而不是 -127

    我知道我是否有这样的号码 1 1001 0001 0011 0011 0000 0001 0101 000 1 sign bit 8 bit biased exponent 23 bit fraction mantissa 我可以通过从有偏
  • 为什么在 SQL Server 中从 float 到 varchar 的转换要四舍五入?

    以下 SQL declare a as float b as float select a 1 353954 b 1 353956 select CAST a as VARCHAR 40 AS a float to varchar CAST
  • == 在 R 中,精度为 .Machine$double.eps [重复]

    这个问题在这里已经有答案了 在 R 中 我发现必须转换易于阅读的代码有点烦人 例如 if det A 1 not always working because of floating point precision to if abs de
  • 使用C标准数学库精确计算标准正态分布的CDF

    标准 C 数学库不提供计算标准正态分布 CDF 的函数 normcdf 然而 它确实提供了密切相关的函数 误差函数 erf 和互补误差函数 erfc 计算 CDF 的最快方法通常是通过误差函数 使用预定义常量 M SQRT1 2 来表示 d
  • 从 std::round 转换为 int 是否安全?

    我有一个问题标准 圆形 http www cplusplus com reference cmath round 带签名 double round double x 假设我有这个代码 int i std round 0 9 在这种情况下 s
  • 如何设置变量内的浮点精度

    我目前正在编写一个程序 需要将浮点后的四舍五入值计算为仅 2 位数字 说吧 我已经声明了 float a If a 3 555然后它会存储a 3 56 围捕 For a 3 423 a的值是a 3 423 不用找了 我可以这样做来打印输出
  • TSQL - 生成文字浮点值

    我理解比较浮点数时遇到的许多问题 并对它们在这种情况下的使用感到遗憾 但我不是表格作者 只有一个小障碍需要克服 有人决定使用浮点数 就像您期望使用 GUID 一样 我需要检索具有特定浮点值的所有记录 sp help MyTable Colu
  • 如何进行带有偏差的浮点舍入(始终向上或向下舍入)?

    我想以偏置舍入浮动 要么总是向下 要么总是向上 代码中有一个特定的点 我需要这个 程序的其余部分应该像往常一样四舍五入到最接近的值 例如 我想四舍五入到最接近的 1 10 倍数 最接近 7 10 的浮点数约为 0 69999998807 但
  • Python 中的舍入浮点问题

    我遇到了 np round np around 的问题 它没有正确舍入 我无法包含代码 因为当我手动设置值 而不是使用我的数据 时 返回有效 但这是输出 In 177 a Out 177 0 0099999998 In 178 np rou
  • 使用浮点/双除法比较可约分数

    假设我有两个分数 a b 和 c d 其中 a b c d 都是大于 0 的整数 使用以下函数检查它们的相等性是否安全 bool are equal fractions int a int b int c int d return stat
  • Javascript 浮点乘以 100 仍然有错误

    我有一个货币字段的文本输入 我在字段中输入 33 91 并在尝试使用 乘以 100 技术时得到以下结果 var curWth parseInt trans withdraw index val 100 3390 var curWth par
  • C++ 中的双精度型数字

    尽管内部表示有 17 位 但 IEE754 64 位 浮点应该正确表示 15 位有效数字 有没有办法强制第 16 位和第 17 位为零 Ref http msdn microsoft com en us library system dou
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找

随机推荐

  • 无法在类库包中的 Entity Framework 7 beta4 上运行迁移

    我无法在类库包中执行迁移命令 我的 dnvm 版本是 来自 global json sdk version 1 0 0 beta5 12021 我正在将其导入到我的项目 JSON 中 dependencies EntityFramework
  • TypeScript 映射类型:获取数组的元素类型

    假设有一个容器类型 其数组属性为未知 生成类型T1 T2等 短T interface MultiContainer Item1 T1 Item2 T2 是否可以使用派生以下类型映射类型 https www typescriptlang or
  • Android SQLite 数据库单元测试

    我是 Android 应用程序开发的新手 我刚刚制作了一个笔记应用程序 我想对数据库的 insertNote readNote 和 updateNote 方法进行单元测试 我该怎么办 这是我的数据库的代码 谢谢 public class D
  • 迁移文件中 Django 的“primary_key”字段中的“serialize=False”是什么意思?

    我找不到原因serialize False在 Django 文档或源代码中的主键字段上设置 有什么特殊原因要设置吗 Thanks Azd325 听起来很简单 该字段不会成为序列化对象的一部分 不过 我猜您的问题与正在迁移的模型有关 并且生成
  • 如何将 IntelliJ IDEA 随机开放端口仅绑定到本地主机?

    当我在 macOS 上运行 IntelliJ IDEA 2021 1 2 终极版或社区版 时 我观察到所有网络接口 eth0 lo 上打开了 3 个随机端口 一个随机端口由 idea 进程打开 另外两个端口由 IntelliJ IDEA 启
  • AngularJS 路由控制器未重新加载

    我有一个非常简单的 AngularJS 应用程序 其中有两条路线 search results 当我从一条路线导航到另一条路线时 一切都按我的预期进行 获取所需的任何资源并完美显示内容 问题是 当我从一条路线导航到同一条路线 即 resul
  • 扫描附近的蓝牙设备

    如果手机打开了蓝牙 应用程序可以读取附近可发现设备的 ID 列表吗 如果是这样 哪个函数返回这样的列表 Thanks 看一看here http developer android com guide topics wireless blue
  • htaccess 替换查询和重定向中的字符

    我需要将查询字符串中的 替换为 而不是重定向 site com abc def to site com search php q abc def 我试过这个 RewriteRule search php q 1 2 R 301 L 以下两条
  • android项目的Maven编译错误“错误:包R不存在”

    我正在尝试使用 Android 应用程序建立一个 MAVEN 项目 我有这个pom文件
  • 类型错误:无法读取未定义的属性“redirect_uris”

    我想编写一个应用程序来处理我的一些以某种方式标记的 Gmail 电子邮件 示例代码here https github com googleapis google api nodejs client blob master samples g
  • Firestore 只同步差异吗?

    我想知道 Firestore 如何处理深度嵌套对象的实时同步 具体来说 它只同步差异吗 例如 我有一个应用程序状态 它只是一个包含 3 个值的数组 并且该状态在设备之间同步 如果我随后更改其中一个值 将同步整个新数组 在网络上传输 还是仅同
  • 如何将服务器时间转换为本地时间?

    我的 php 文件托管在世界其他地方 这date and time 函数返回服务器上的日期 时间 如何转换该日期 使其与我的本地日期 时间相同 服务器上的日期比我的当地时间晚 10 小时 我可以直接进行硬编码并从服务器时间中减去它 但什么是
  • Android INSTALL_FAILED_INVALID_URI

    当我尝试通过 Eclipse 将 Android 应用程序安装到设备时 我刚刚开始收到以下错误 Installation failed due to invalid URI Please check logcat output for mo
  • 自定义 PageControl 图像 - Swift

    我正在尝试为 UIPageControl 点设置图像 我需要更改默认点 而不是我需要图像 我使用了下面的代码 self pageCtrl currentPageIndicatorTintColor UIColor init patternI
  • Eclipse Juno 加载描述符错误

    我刚刚将 Eclipse 从 Galileo 更新为 Juno 我创建了一个新的工作区并导入了一个基于 Java Spring MVC 的项目 当我打开它时 它开始 加载描述符 然后弹出一条错误消息 加载 mta pfm 的描述符 期间发生
  • SQL查询删除两年以上的记录

    我需要通过从多个表中删除两年以上的记录来清理非常臃肿的 SQL 数据库 做到这一点最有效的方法是什么 您有什么方法可以确定记录的 年龄 吗 即 表中是否有一列代表行的年龄或可用于计算年龄的日期 如果是这样 那应该是一个简单的 DELETE
  • MySql:查找特定记录的行号

    我正在使用一个通用数据面板 该面板可以向该面板提供各种不同的查询 它们可能是从表或视图中选择的简单查询 也可能是用户使用复杂的联接和其他表达式自行定义的复杂查询 我正在尝试修改我的数据面板 以便如果用户选择一条记录 然后对表进行排序 我会找
  • 为什么结合性是运算符的基本属性,而不是优先级的基本属性

    在任何编程语言教科书中 我们总是被告知该语言中的每个运算符如何具有左结合性或右结合性 结合性似乎是任何运算符的基本属性 无论其需要多少操作数 在我看来 我们可以将任何关联性分配给任何运算符 无论我们如何将关联性分配给其他运算符 但为什么会这
  • 在c++中接收USB设备插入的通知/事件/信号

    我已经寻找了一段时间 但一直无法找到这个问题的答案 我正在尝试接收特定 USB 设备的连接通知 这是我所知道的 我运行的是 linux 内核版本 3 2 我有识别 USB 设备所需的 ID 我创建了一个用于读取和写入设备的内核模块 内核模块
  • 为什么不使用基于二进制补码的浮点?

    float64 32 和 16 的 IEEE 754 标准使用有符号尾数和有偏差指数 作为一名设计硬件架构的学生 对我来说 对有效数和指数部分使用二进制补码更有意义 例如 定义 32 位 半精度 浮点数 第一位表示符号 接下来的 8 位 指