【发布时间】:2018-12-05 17:42:15
【问题描述】:
printf 等函数如何从浮点数中提取数字?我理解原则上如何做到这一点。给定一个数字x,您想要其中的第一个n 数字,将x 缩放10 的幂,使x 介于pow(10, n) 和pow(10, n-1) 之间。然后将x转换成整数,取整数的位数。
我试过这个,它奏效了。有点。我的答案与printf 给出的前 16 位十进制数字的答案相同,但之后的答案往往不同。 printf是怎么做到的?
【问题讨论】:
-
a
double(64 位 IEEE-754 浮点数)无论如何只有大约 15 位的精度 -
@vu1p3n0x:一个 IEEE-754 浮点数精确地表示一个数字。根据 IEEE-754 标准中的规范,它是无限精确的。各种应用程序有时希望将这些数字精确地转换为十进制。
-
@EricPostpischil:您写的内容在技术上是正确的,但 vu1pn3n0x 所说的是数据类型的精度,在其大部分范围内约为 15-16 位。
-
@DietrichEpp:数据类型在其整个范围内都是准确的。 IEEE-754 标准对此很清楚:每个浮点数精确地表示一个数字。 操作 执行舍入。数字没有近似值。 vu1p3n0x 所说的是一个关于使用二进制浮点作为十进制的粗略概念。但是,使用浮点不仅是一个糟糕的概念,而且与这个问题无关。 OP 不会询问任何涉及浮点数的问题,这些浮点数已被用于尝试十进制算术。他们询问正确打印浮点数。
-
@EricPostpischil:您对“精度”一词的使用不符合 IEEE 754 标准。 precision:一种格式中可以表示的最大有效位数p,或四舍五入的位数。请不要只假装第二个意义的存在只是为了纠正使用第一个意义的人。
标签: c++ c floating-point printf