问题标签 [strtod]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1489 浏览

c++ - C ++将字符串精确转换为双精度

我需要将字符串转换为精度高达 15 位的双精度

我读过很多文章和类似的问题,他们建议在将数字打印到屏幕时使用 setprecision(15) 。

例如:

如果我写

它只会打印 34.9439 而不是 34.9438553

我本来可以写的

它会起作用,但我需要变量 lon1 本身具有 15 位精度,因为我需要变量内的整个数字,而不仅仅是当我将它打印到屏幕上时。

有谁知道该怎么做?

0 投票
2 回答
126 浏览

c - 将字符串转换为双精度并返回字符串

我在将字符串转换为双精度时遇到问题,并且不确定出了什么问题。我的添加功能:

这是我的打开保险丝功能部分:

所以我尝试cat test/add/1/2得到一个结果,0.00在我的调试器中我得到:

因此,在 add 函数中,第一个 printf 正确显示了字符串“1”和“2”,但是当我尝试使用strtod()or对其进行转换时atof(),它会将我的字符串转换为 0.000000 和 0.000000。有任何想法吗?

0 投票
3 回答
1375 浏览

c - strtod 下溢,返回值 != 0

这是我的测试代码:

使用此代码,我得到d == 1.8011670033376514e-308and errno == ERANGE

从 strtod(3) 开始:

如果正确的值会导致溢出,则返回正负HUGE_VALHUGE_VALF, HUGE_VALL)(根据值的符号),并ERANGE存储在errno. 如果正确的值会导致下溢,则返回零并ERANGE存储在errno.

因此,在我看来,要么errno应该为零(无错误),要么d应该为零(下溢)。

这是一个错误,还是我错过了什么?这发生在许多不同版本的 eglibc 和 gcc 上。

0 投票
0 回答
258 浏览

c - 使用 atof 转换的值的 printf

我正在尝试为我的 SAM3S 微控制器构建一个项目。我正在使用 atof 函数将通过 UART 传递给 micro 的字符串转换为浮点数,但是当我想查看转换结果(通过 printf)时,打印的值仅为“f”。

操作的结果是:“收到 10.000 转换为:f”。我什至用 sscanf 也试过了strtod(str,NULL); ,但毫无希望,但值保持不变。每个用“数字”制作的微积分在打印时都会返回“f”。我认为错误在于转换。你有什么建议吗?谢谢

0 投票
0 回答
847 浏览

c - GNU C:atof()、strtof() 和 strtod() 失败(Debian for BeagleBoard)

我有一些使用 strtod(...) 将 ASCII 字符串转换为双精度的 C 代码。该程序已针对 x86(调试)、ARM 和 PowerPC(嵌入式目标系统)进行编译。ARM 板实际上是一个运行 Debian 的 BeagleBoard xM,可用于它。

我发现 strtod() 不能在 ARM / Debian 系统上正确转换值。事实上,我尝试的所有值都是 0.000。

为了演示,我编写了以下非常简单的测试程序:

所有这些都是在运行 Ubuntu 的 x86 PC 上编译的(实际上是在虚拟机中)。我有用于 PowerPC 和 ARM 编译的交叉编译器工具链。

在 x86 和 PowerPC 系统上,输出符合预期,即:

然而,当在 BeagleBoard 上运行时,我得到了这个:

啊???我错过了什么愚蠢的事情吗?请注意,“myEnd”指针只是用来显示 strtod() 和 strtof() 确实找到了第一个非数字字符,因此找到了数字的结尾。他们在两种情况下都报告了数字中正确的字符数(3),但转换后的值是错误的。我不认为这是一个语言环境问题,因为没有小数点可以混淆。

编辑:

我刚刚使用“-static”选项重新编译了测试程序。当然,这使二进制文件变得更大,但现在它可以在目标 ARM 平台上正常工作。

我对图书馆的工作方式有点模糊。另外,我不记得我是如何构建我的交叉编译器工具链的。它可能不是从与实际安装在目标板上的 Debian Linux 相同的源构建的。

那么,atof() 等莫名其妙的行为是否意味着动态链接的可执行文件“预期”的库与系统上的实际库不同?我很惊讶这并没有导致更严重的问题。我们已经运行这个系统一年了,到目前为止,这是我们遇到的唯一一个奇怪的错误。

0 投票
1 回答
279 浏览

c - `strtod("3ex", &end)` 的结果应该是什么?`sscanf` 呢?

在我的实验中,这个表达式

d用输入字符串中的字符初始化3.0并放置end指针。'e'这正是我期望它的行为。该'e'字符可能看起来是指数部分的开始,但由于缺少实际的指数值(6.4.4.2 要求),因此'e'应将其视为完全独立的字符。

但是,当我这样做时

我注意到它sscanf同时消耗'3''e'用于%lf格式说明符。变量d接收3.0值。变量c'x'in 结尾。这对我来说看起来很奇怪,原因有两个。

首先,由于语言规范在描述格式说明符strtod的行为时涉及到,我直观地期望以相同的方式处理输入(即选择与终止点相同的位置)。但是,我知道历史上应该不超过一个字符返回输入流。这限制了一个字符可以执行的任何前瞻的距离。上面的例子需要至少两个字符的前瞻。因此,假设我接受了从输入流中消耗和消耗的事实。%f%lfstrtodscanfscanf%lf'3''e'

但后来我们遇到了第二个问题。现在sscanf必须将其转换"3e"为 type double"3e"不是浮点常量的有效表示(同样,根据 6.4.4.2,指数值不是可选的)。我希望sscanf将此输入视为错误:在%lf转换期间终止,返回0和离开dc保持不变。但是,上述sscanf成功完成(返回2)。

这种行为在标准库的 GCC 和 MSVC 实现之间是一致的。

所以,我的问题是,在 C 语言标准文档中,它究竟允许在哪里sscanf表现如上所述,参考以上两点:消耗更多strtod并成功地将这样的序列转换为"3e"

通过查看我的实验结果,我可能可以“逆向工程”sscanf的行为:消耗尽可能多的“看起来正确”,从不后退,然后将消耗的序列传递给strtod. 这种方式'e'会被 . 消耗%lf,然后被strtod. 但是语言规范中的所有内容都是这样吗?

0 投票
2 回答
2414 浏览

c - 如果字符串为零,则返回 strtod() 的值

根据 MSDN:

  • strtod如果无法执行转换或发生下溢,则返回 0。

如果我的字符串等于零(即 0.0000)怎么办?我怎么知道转换是否没有错误?

OK,我用下面的代码来验证一下思路:

我看到 MyNum = 0,但从来没有看到 Y 的内容复制到 MyEnPtr,或者在这个强制错误中 errno = 0。任何想法?

0 投票
2 回答
313 浏览

c - 带有 strtod()/strtold() 的意外 endptr

我希望 和都endptr指向相同的值。然而它们不同。我怀疑是不正确的。OTOH,这可能是规格不明确且任一结果都可接受的情况。strtod()strtold()strtold()

这是一个错误(以及使用哪个函数)还是未定义/未指定的行为?

使用:gcc\x86_64-pc-cygwin\4.8.3

[编辑]

gcc 命令gcc -I"C:\cygwin64\lib\gcc\x86_64-pc-cygwin\4.8.3\include" -O0 -g3 -Wall -c -fmessage-length=0 -std=c99 -MMD -MP -MF"string_fp.d" -MT"string_fp.d" -o "string_fp.o" "../string_fp.c"

GCC 4.9.2

0 投票
2 回答
226 浏览

c - 无法在c中获得字符串转换strtod

有人可以帮我(对不起英语),我试图将字符串转换为双精度,但是当我无法得到它时,这是我的代码(谢谢,我将非常感谢帮助):

当我在输出中输入大于 10 的值时,它只打印第一个数字,如下所示:

0 投票
1 回答
943 浏览

c++ - strtod 如何检查 0 是错误还是好值

我想将字符串转换为双精度。我这样做:

如果结果为 0,我如何检查结果是否正常?例如,如果我发送字符串(“0”),我将得到 0,这不是错误。但我也可以发送一些其他字符串——即数字,但它不会被转换,我也会得到 0(错误),(我说的是 *end == 0 时的情况)。