1

我不想不必要地重新发明轮子,但我一直在寻找 strtod 的功能,但有一个基本参数 (2,8,10,16)。(我知道 strtoul 允许使用基本参数,但我正在寻找返回类型 double)。任何正确方向的建议/指示?谢谢。

4

2 回答 2

2

对于任意基数,这是一个难题,但只要你的基数是 2 的幂,简单的朴素算法就可以正常工作。

strtod(在 C99 中)支持与 C 语言的十六进制浮点常量格式相同的十六进制浮点数。0x前缀是必需p的,分隔指数,指数以 10 为底,代表 2 的幂。如果你需要支持 C99 之前的库,你就没有这样的运气了。但是由于您也需要基本 2/4/8,因此最好还是自己滚动。

编辑:朴素算法的概述:

  1. double从初始化为 0的浮点累加器变量(或任何您喜欢的变量)开始。
  2. 从最左边的数字开始,一直到小数点,对于您处理的每个字符,将累加器乘以基数,然后将字符的值作为数字相加。
  3. 在小数点之后,开始一个新的运行位置值变量,最初是 1/base。在您处理的每个字符上,将数字值乘以位值变量,然后将位值变量除以基数。
  4. 如果您看到指数字符,请将其后面的数字读取为整数,并使用标准库函数之一将浮点数按 2 的幂进行缩放。

如果您想处理可能对数字过多的表格进行四舍五入,则必须在超过第 2 步或第 3 步中的有效位数后计算出该逻辑。否则您可以忽略它。

于 2011-02-10T21:07:22.590 回答
0

不太可能 - 我从未见过在其他数基中编码为“小数”的浮点数。

于 2011-02-10T21:02:06.470 回答