这不是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
如果它是一个IEEE 754问题你应该在问题中说。并非每台计算机都使用IEEE进行浮点运算!
—
alephzero
除了偏离主题之外,从第二段开始,OP 似乎并不知道算法应该做什么 - 而且我们的工作不是猜测规范应该是什么!帖子后面的评论可能暗示OP没有意识到即使像“0.1”这样的字符串也没有任何长度数据的二进制浮点精确表示。
—
alephzero