Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 带基本参数的strod_C_C89_Strtod - Fatal编程技术网

C 带基本参数的strod

C 带基本参数的strod,c,c89,strtod,C,C89,Strtod,我不想不必要地重新发明控制盘,但我一直在寻找strtod的功能,但有一个基本参数(2,8,10,16)。(我知道strtoul允许一个基本参数,但我正在寻找返回类型double)。有没有正确方向的建议/指针?谢谢。不太可能-我从未见过在其他基数中被编码为“小数”的浮点数。对于任意基数,这是一个很难解决的问题,但只要基数是2的幂,简单的朴素算法就可以很好地工作 strod(在C99中)支持与C语言的十六进制浮点常量格式相同的十六进制浮点0x前缀是必需的,p分隔指数,指数以10为基数,表示2的幂。如

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

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

对于任意基数,这是一个很难解决的问题,但只要基数是2的幂,简单的朴素算法就可以很好地工作

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

编辑:朴素算法概述:

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

  • 如果您想要处理可能包含太多数字的四舍五入表单,那么在第2步或第3步中,一旦超过有效位数,就必须计算出该逻辑。否则您可以忽略这一点。

    相反,十六进制浮点是C标准的一部分。另外值得注意的是,为了高效地存储精确的浮点值,也为了避免由于其他软件中的错误而读回错误值的风险,当打印为文本时,你应该总是把浮动存储在两个基数中。@它们是在C99标准中,而不是C++。即使在C语言中,它们也非常罕见。谢谢。我相信我会对浮点部分使用我自己的函数,并将整数部分传递给strtol,然后将结果加在一起,这样我就可以继续使用C89了。实际上,这不起作用。如果该值太大,无法放入
    long
    ,它将失败。请参阅我的更新,了解如何实现“naive算法”。