- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设你有一个像“0.1”这样的字符串,它只能近似表示为二进制 float ,你想将它转换为单精度 float 。这可以作为
strtof(s, 0);
或
(float)strtod(s, 0);
直觉上,这些应该给出相同的结果,但直觉在所有情况下都是正确的吗?或者是否存在任何边缘情况,在这种情况下,通过进行两次舍入,第二种形式给出的结果与第一种形式略有不同?
最佳答案
strtod
和 strtof
的 C 标准规范未指定。它为 strtof
总是、经常或从不返回 (float)strtod
的可能性留下了空间。 ( This paragraph 指的是包含 that paragraph 的标准的另一部分,它说“结果是最近的可表示值,或者是与最近的可表示值紧邻的更大或更小的可表示值,以实现定义的方式选择”)。
strtod
和strtof
的典型 实现分别返回最近的double
和最近的float
传递给它们的十进制表示。当这些函数以这种方式运行时,strtof(s, 0)
几乎总是与(float)strtod(s, 0)
相同。它们不相同的十进制表示表示为 double-rounding problem ,因为首先将十进制表示舍入为 double
然后为 float
产生的结果与直接舍入为不同的结果 float
。请注意,发生这种情况时,strtof
结果是更准确的结果。中间舍入使误差略大于 ULP 的一半,而不是略小于 ULP 的一半。
在转换为 float
之前经过 double
时出现双舍入问题的十进制表示的一个示例是 1.01161128282547
(取自 this quiz ) .最近的 double
恰好位于两个 float
的中间。直接舍入到 float
得到最近的 float
,通过最近的 double
产生另一个 float
。
关于c - strtof = strtod 后跟 cast?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307711/
这个问题已经有答案了: Is floating point math broken? (33 个回答) 已关闭 4 年前。 编辑- 所以我明白这个问题没有解决办法。有谁知道 C 中的函数可以从数组(s
这个问题已经有答案了: Why are floating point numbers inaccurate? (5 个回答) Why is scanf taking the wrong input f
我有一个关于分配和释放内存的问题。 我想循环读取一个char buffer,并将float值保存到一个vector中。我通过读取 fstream 获取缓冲区。 但我的方法在最后删除缓冲区时总是崩溃。
在 Visual Studio 2013 中,我有以下测试代码: #include #include #include #include int main ( int argc, const
这个问题在这里已经有了答案: How do I print a double value with full precision using cout? (17 个答案) 关闭 6 年前。 这里:
我根本找不到这个函数在哪个库/头文件中,我看了很多人使用这个函数的例子,但是没有结果......这些是我包含的所有内容: #include "Console.h" #include "Direct3D
首先,使用标志 -Wall、-ansi、-pedantic 进行编译。没有警告或错误。并且没有任何调试有帮助。 基本上我的代码工作正常但是当我使用 strtof() 将标记从字符串转换为 float
假设你有一个像“0.1”这样的字符串,它只能近似表示为二进制 float ,你想将它转换为单精度 float 。这可以作为 strtof(s, 0); 或 (float)strtod(s, 0); 直
这可能是什么问题? It doesn't matter what number I choose for str, it is always 26815615859885194199148049996
#include #include #include int main(){ char aaa[35] = "1.25"; char* bbb = &(aaa[0]); char**
我正在尝试将 CSV 文件解析为 C 中的二维数组。我想制作一个具有结构的矩阵: typedef struct { int row; int col; float **arr;
我的这部分 C 代码有些问题。除了返回 0.000 而不是 float 的函数“strtof”之外,一切都应该运行良好。 代码应该做什么:读一行,例如“一个12”如果第一个字符是“a”,则使用 str
可能这是一个非常愚蠢的问题,但我不明白......为了从 ASCII 表示转换为相关数字,我在 Visual Studio 2012 中使用 strtof()。根据 https://msdn.micr
与 包含以下代码给出了 123.34 的输出. #include int main() { char *str="123.34"; float f= strtof(str,NULL)
我的 C 生锈了。我正在尝试将字符串转换为 float (或 double )。我试过 atof() 和 strtof(),并尝试按照说明进行操作 here和 here .运气不好。 这是我的代码:
是否有任何计划添加在当前语言环境下不变的 C 标准库字符串处理函数版本? 目前有很多脆弱的解决方法,例如,来自 jansson/strconv.c: static void to_locale(str
标准 C 库函数 strtof 和 strtod 具有以下签名: float strtof(const char *str, char **endptr); double strtod(const c
标准 C 库函数 strtof 和 strtod 具有以下签名: float strtof(const char *str, char **endptr); double strtod(const c
我在启动时立即收到以下错误,但仅适用于运行 API (ProfilerService.java:44) at [[packagename]].App.(App.kt
我是一名优秀的程序员,十分优秀!