在IEEE 754中处理字符串到浮点十进制截断的正确方法是什么?[关闭]


3

这不是StackOverflow问题,因为软件工程师没有足够的数学技能来回答IEEE 754问题,因此必须由IEEE导师回答。

我必须使用C ++模板为Grisu和Unicode 实现我自己的字符串到浮点和浮点到字符串算法。我使用了维基百科单精度浮点格式文章中的以下算法:

  • 考虑带有整数和小数部分的实数,例如12.375
  • 将整数部分转换并规范化为二进制
  • 使用如下所示的以​​下技术转换分数部分
  • 添加两个结果并调整它们以产生适当的最终转换

我不确定当转换为float的字符串具有更多的数字精度时我该怎么做我可以存储在32位(例如)浮点数但它没有达到+/-无穷大,并且正确的方法来舍入不精确的数字/小数点。对于32位浮点数,只有7位精度。对于64位浮点数,它的精度为16位。除此之外的任何数字必须使用IEEE 754舍入规则进行舍入

基础2选项

我们首先转换整数部分,就像wiki条目中的算法一样,通过扫描到最低有效数字然后通过将每个数字乘以10的幂来解析回最高有效数字(即标准字符串到整数算法)并使用无符号乘法环绕来检测位溢出,在基数2中舍入; 这听起来不对我,我认为维基百科文章不是最好的算法。

基数10选项

我们将每个数字转换为带有单个最高有效数字的指数表示法,例如转换123456780123456789.012。使用IEEE 754舍入规则到1.234567e20 。听起来是最好的选择,因为我们只需要解析一次文本,我们必须扫描指数,我们可以避免字符串到整数算法。由于数字仍然在10的基数,因此基数为10的舍入听起来很准确,你只需要读取数字和小数一次,而不需要乘以10的幂。如果这是首选方法,那么应该更新wiki条目。


1
这个问题与工程无关,更适合Stack Overflow软件工程
Wasabi

2
这是一个IEEE 754问题,所以这不是一个软件工程问题,我问过的软件工程师也不知道。这是关于无效位模式的技术性,因此是计算机工程问题,因为它适用于硬件,固件和软件。

如果它是一个IEEE 754问题你应该在问题中说。并非每台计算机都使用IEEE进行浮点运算!
alephzero

1
除了偏离主题之外,从第二段开始,OP 似乎并不知道算法应该做什么 - 而且我们的工作不是猜测规范应该是什么!帖子后面的评论可能暗示OP没有意识到即使像“0.1”这样的字符串也没有任何长度数据的二进制浮点精确表示。
alephzero

@Cale - 我愿意在SE.SE或其他任何有关主题的地方回答这个问题,我们都有账号。
Rob
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.