【问题标题】:scanf float, print float, different value?scanf 浮点数,打印浮点数,不同的值?
【发布时间】:2011-12-14 21:04:12
【问题描述】:
#include "stdafx.h"
#include "stdio.h"
#include "math.h"

int main()
{
float c;

printf("Type c");

scanf("%f", &c);


    printf("C is c: %f ",c);

    while(getchar()!='\n');
    getchar();
    return 0;

    }

非常简单的代码,我刚从 C 开始。 大多数数字都可以,但是例如如果我输入 47.2 那么它会打印出我 47.200001 和 88.4321 输出 88.432098 但其他数字如 5.4 工作正常 5.400000 我正在使用 Microsoft Visual Studio 10。

另外一件事如果上面的代码没有放 float c 我放了 double 我不能 printf 我应该放什么来代替 %f? 但是我的第一个问题更让我担心,也许这与编译器有关也许我正在将c代码编译为c++,我不知道。

【问题讨论】:

  • @MichaelHaidl:根据标准,%f%lf 在传递给printf() 时具有相同的行为,它们只是scanf() 不同。

标签: double floating-accuracy


【解决方案1】:

关于您的数字准确性。当以二进制格式存储浮点值时,这是一个已知问题。根据 PHP 文档稍作修改...

浮点数的精度有限。尽管取决于系统,但大多数语言通常使用 IEEE 754 双精度格式,由于 1.11e-16 的四舍五入,这将给出最大的相对误差。非初等算术运算可能会产生较大的误差,当然,当多个运算复合时,必须考虑误差传播。

此外,可以精确表示为以 10 为底的浮点数的有理数,如 0.1 或 0.7,不具有以 2 为底的浮点数的精确表示,无论尾数大小如何,它都在内部使用.因此,它们不能被转换成它们内部的二进制对应物,而不会有小的精度损失。这可能会导致令人困惑的结果:例如, floor((0.1+0.7)*10) 通常会返回 7 而不是预期的 8,因为内部表示将类似于 7.9999999999999991118....

所以永远不要相信浮点数的结果是最后一位,也不要比较浮点数是否相等。

如果您需要更高的精度,您可能需要研究补充库,其唯一目的是处理高精度数字。

【讨论】:

  • 如果英语是我的主要语言,我会直觉地想到“浮动”这个词的意思,我认为它会做固定品脱算术en.wikipedia.org/wiki/Fixed-point_arithmetic。谢谢阿希尔曼
  • 如果我错了,请纠正我,但不是双精度(或某些语言中的小数)更精确吗?
猜你喜欢
  • 1970-01-01
  • 2012-03-18
  • 1970-01-01
  • 1970-01-01
  • 2020-12-29
  • 2021-11-21
  • 1970-01-01
  • 2020-02-28
  • 2020-11-11
相关资源
最近更新 更多