我知道浮子固有的不精确.我感到困惑的是为什么我会从我期望解决的问题返回"100"0.99999999等.0.33*3怎么可能产生100?
这是我的代码:如果我说
float x = 100.0/3.0;
printf("%f",x*3.0);
Run Code Online (Sandbox Code Playgroud)
输出为"99.999996".但如果我说
printf("%f",(100.0/3)*3);
Run Code Online (Sandbox Code Playgroud)
输出为"100".它们不应该相同吗?我希望x解决(100.0/3.0),正是用明文写的 - 然而它们会产生两种不同的结果.
这是我的代码,我不知道为什么会发生这种情况:
#include <stdio.h>
void foo(float *);
int main()
{
int i = 10, *p = &i;
foo(&i);
}
void foo(float *p)
{
printf("%f\n", *p);
}
Run Code Online (Sandbox Code Playgroud)
输出:
0
Run Code Online (Sandbox Code Playgroud) #include <stdio.h>
int main()
{
printf("%f",5);
}
Run Code Online (Sandbox Code Playgroud)
此代码打印0.000000.任何人都可以解释为什么会这样.
这是我的C程序:
#include <stdio.h>
main(){ printf("%f", 5/3); }
Run Code Online (Sandbox Code Playgroud)
我期待输出1.000000,但我得到的输出是0.000000.有人可以解释原因吗?
这是我的代码.
float total,rate;
rate = score / 25;
printf("Total: %f", rate);
Run Code Online (Sandbox Code Playgroud)
但这不起作用; 它总是输出0.000.你能帮我吗?
它不是关于印刷.它是关于存储价值.
int x = 1234;
double y = 0.3456;
double z = x + y;
目前z包含1234.35.我想要z包含1234.3456
可以做些什么来实现这一目标?
我刚检查过它numpy的sine功能.显然,它会在pi周围产生非常不准确的结果.
In [26]: import numpy as np
In [27]: np.sin(np.pi)
Out[27]: 1.2246467991473532e-16
Run Code Online (Sandbox Code Playgroud)
预期的结果是0.为什么numpy那么不准确?
在某种程度上,我不确定将计算结果视为不准确是否可接受:它的绝对误差在一个机器epsilon(对于binary64)内,而相对误差是+inf- 我觉得有些困惑的原因.任何的想法?
[编辑]我完全理解浮点计算可能不准确.但是大多数浮点库可以设法在一小部分误差范围内提供结果.这里,相对误差是+ inf,这似乎是不可接受的.想象一下,我们想要计算
1/(1e-16 + sin(pi))
Run Code Online (Sandbox Code Playgroud)
如果我们使用numpy的实现,结果将是灾难性的错误.
有人可以解释为什么C printf在第二种情况下会逐渐减少吗?
printf("%.03f", 79.2025); /* "79.203" */
printf("%.03f", 22.7565); /* "22.756" */
Run Code Online (Sandbox Code Playgroud) 在学习浮点运算时,我发现了一些东西,我引用:'浮点数/双精度不能精确存储0.1".
SO上有一个问题指向同一件事,接受的答案也很有说服力.但是我想在我自己的计算机上试一试,所以我写下面的程序如下
double a = 0.1;
if (a == 0.1)
{
Console.WriteLine("True");
}
else
{
Console.WriteLine("False");
}
Console.Read();
Run Code Online (Sandbox Code Playgroud)
和控制台打印True.令人震惊,因为我已经说服了别的东西.任何人都可以告诉我浮点运算是怎么回事?或者我只有一台将数值存储为10的计算机?
该程序是关于t为的不同值打印浮点值i,但是每次都打印相同的值。即使的值t改变了,它也总是为的每个值打印零n。
为什么会这样呢?
#include <stdio.h>
int main(){
float n;
float sum=0,t,s=1,i;
scanf("%f",&n);
for(i=0;i<n;i++){
t=(100/(1+2i));
printf("\n%f",t);
}
}
Run Code Online (Sandbox Code Playgroud)
输入5
输出:
0.000000
0.000000
0.000000
0.000000
0.000000
Run Code Online (Sandbox Code Playgroud)
这是ideone.com中的结果。