【发布时间】:2010-03-23 11:10:43
【问题描述】:
我正在开发适用于 Windows 和 Mac OS X 的跨平台应用程序,但我遇到了两个标准 C 库函数的问题:
-
strtod()- 字符串到双精度转换 -
sprintf()- 用于输出双精度浮点数时)
他们的 GCC 和 MSVC 版本返回不同的结果,以尾数的一些数字表示。但是如果指数值很大,它就起着至关重要的作用。一个例子:
MSVC: 9,999999999999999500000000000000e+032
GCC: 9,999999999999999455752309870428e+32
MSVC: 9,999999999999999500000000000000e+033
GCC: 9,999999999999999455752309870428e+33
MSVC: 9,999999999999999700000000000000e+034
GCC: 9,999999999999999686336610791798e+34
输入的测试编号在 MSVC 和 GCC 下具有相同的二进制表示。
我正在寻找这些函数的经过良好测试的跨平台开源实现,或者只是寻找能够正确一致地将双精度转换为字符串并返回的一对函数。
我已经尝试过clib GCC的实现,但是代码太长而且太依赖其他源文件,所以我预计适配会比较困难。
你会推荐哪些字符串到双精度和双精度到字符串函数的实现?
【问题讨论】:
-
当你说“不同的结果”时,你的意思是你得到的结果不正确还是只是小数点后第n位有微小的差异?
-
它们在尾数的某些位数上有所不同。但是如果指数值很大,它就起着至关重要的作用。 An example: MSVC: 9,999999999999999500000000000000e+032
GCC: 9,999999999999999455752309870428e+32
MSVC: 9,999999999999999500000000000000e+033 GCC: 9,999999999999999455752309870428e+33 MSVC: 9,999999999999999700000000000000e+034 GCC: 9,999999999999999686336610791798e+ 34 输入的测试编号在 MSVC 和 GCC 下具有相同的二进制表示。 -
不是关键角色;这是一个微不足道的区别。你没看懂浮点数。
标签: string gcc double visual-c++