问题标签 [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.
c++ - C ++将字符串精确转换为双精度
我需要将字符串转换为精度高达 15 位的双精度
我读过很多文章和类似的问题,他们建议在将数字打印到屏幕时使用 setprecision(15) 。
例如:
如果我写
它只会打印 34.9439 而不是 34.9438553
我本来可以写的
它会起作用,但我需要变量 lon1 本身具有 15 位精度,因为我需要变量内的整个数字,而不仅仅是当我将它打印到屏幕上时。
有谁知道该怎么做?
c - 将字符串转换为双精度并返回字符串
我在将字符串转换为双精度时遇到问题,并且不确定出了什么问题。我的添加功能:
这是我的打开保险丝功能部分:
所以我尝试cat test/add/1/2
得到一个结果,0.00
在我的调试器中我得到:
因此,在 add 函数中,第一个 printf 正确显示了字符串“1”和“2”,但是当我尝试使用strtod()
or对其进行转换时atof()
,它会将我的字符串转换为 0.000000 和 0.000000。有任何想法吗?
c - strtod 下溢,返回值 != 0
这是我的测试代码:
使用此代码,我得到d == 1.8011670033376514e-308
and errno == ERANGE
。
从 strtod(3) 开始:
如果正确的值会导致溢出,则返回正负
HUGE_VAL
(HUGE_VALF
,HUGE_VALL
)(根据值的符号),并ERANGE
存储在errno
. 如果正确的值会导致下溢,则返回零并ERANGE
存储在errno
.
因此,在我看来,要么errno
应该为零(无错误),要么d
应该为零(下溢)。
这是一个错误,还是我错过了什么?这发生在许多不同版本的 eglibc 和 gcc 上。
c - 使用 atof 转换的值的 printf
我正在尝试为我的 SAM3S 微控制器构建一个项目。我正在使用 atof 函数将通过 UART 传递给 micro 的字符串转换为浮点数,但是当我想查看转换结果(通过 printf)时,打印的值仅为“f”。
操作的结果是:“收到 10.000 转换为:f”。我什至用 sscanf 也试过了strtod(str,NULL);
,但毫无希望,但值保持不变。每个用“数字”制作的微积分在打印时都会返回“f”。我认为错误在于转换。你有什么建议吗?谢谢
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() 等莫名其妙的行为是否意味着动态链接的可执行文件“预期”的库与系统上的实际库不同?我很惊讶这并没有导致更严重的问题。我们已经运行这个系统一年了,到目前为止,这是我们遇到的唯一一个奇怪的错误。
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
%lf
strtod
scanf
scanf
%lf
'3'
'e'
但后来我们遇到了第二个问题。现在sscanf
必须将其转换"3e"
为 type double
。"3e"
不是浮点常量的有效表示(同样,根据 6.4.4.2,指数值不是可选的)。我希望sscanf
将此输入视为错误:在%lf
转换期间终止,返回0
和离开d
并 c
保持不变。但是,上述sscanf
成功完成(返回2
)。
这种行为在标准库的 GCC 和 MSVC 实现之间是一致的。
所以,我的问题是,在 C 语言标准文档中,它究竟允许在哪里sscanf
表现如上所述,参考以上两点:消耗更多strtod
并成功地将这样的序列转换为"3e"
?
通过查看我的实验结果,我可能可以“逆向工程”sscanf
的行为:消耗尽可能多的“看起来正确”,从不后退,然后将消耗的序列传递给strtod
. 这种方式'e'
会被 . 消耗%lf
,然后被strtod
. 但是语言规范中的所有内容都是这样吗?
c - 如果字符串为零,则返回 strtod() 的值
根据 MSDN:
strtod
如果无法执行转换或发生下溢,则返回 0。
如果我的字符串等于零(即 0.0000)怎么办?我怎么知道转换是否没有错误?
OK,我用下面的代码来验证一下思路:
我看到 MyNum = 0,但从来没有看到 Y 的内容复制到 MyEnPtr,或者在这个强制错误中 errno = 0。任何想法?
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
c - 无法在c中获得字符串转换strtod
有人可以帮我(对不起英语),我试图将字符串转换为双精度,但是当我无法得到它时,这是我的代码(谢谢,我将非常感谢帮助):
当我在输出中输入大于 10 的值时,它只打印第一个数字,如下所示:
c++ - strtod 如何检查 0 是错误还是好值
我想将字符串转换为双精度。我这样做:
如果结果为 0,我如何检查结果是否正常?例如,如果我发送字符串(“0”),我将得到 0,这不是错误。但我也可以发送一些其他字符串——即数字,但它不会被转换,我也会得到 0(错误),(我说的是 *end == 0 时的情况)。