所以我正在尝试编写一个程序,该程序采用浮点值并用分数表示。我面临着一个奇怪的问题。这是我的计划:
#include<stdio.h>
#include<math.h>
int gcd(int,int);
void main()
{
int n,n1,n2,g;
float a,a1;
printf("Enter number of digits after decimal point: ");
scanf("%d",&n);
printf("Enter number: ");
scanf("%f",&a);
n2=pow(10,n);
a1=a*n2;
n1=(int)a1;
g=gcd(n1,n2);
n1/=g;n2/=g;
printf("The number is %d/%d",n1,n2);
}
int gcd(int a,int b)
{
int x,flag=0;
int n1=((a>b)?a:b);
int n2=((a<b)?a:b);
for(x=n1;x>=1;x--)
{
if(n1%x==0 && n2%x==0)
{
flag=1;break;
}
}
if(flag==1)
return x;
else
return 1;
}
现在这个程序给出了只有1个小数点的数字的正确答案。例如:
Enter number of digits after decimal point: 1
Enter number: 2.5
The number is 5/2
但是对于小数点后两位或更多位数的数字,它会给出错误的答案。例如:
Enter number of digits after decimal point: 2
Enter number: 2.50
The number is 247/99
我知道浮点数不准确,但我没想到这个变化很大。有没有办法解决这个问题并使这个程序工作?
答案 0 :(得分:5)
适合我。我相信原因是您使用include Irvine32.inc
.data
.code
main proc
mov ebx, -27
mov eax, 33
mov ecx, 50
L1:
pushad ; save all 32bit registers
call BetterRandomRange
call writeint
call crlf
popad ; restore all 32bit registers
loop L1
main endp
BetterRandomRange proc
neg ebx
add eax, ebx
call randomrange
sub eax, ebx
ret
BetterRandomRange endp
end main
而pow(10, n)
是inexact on your platform。请改用简单的for循环:
pow
答案 1 :(得分:0)
像pow(10, n)
这样的函数可能会生成接近整数值的结果而不是精确的整数值。如果您想继续使用(int)
,请使用其中一个轮次函数,而不是使用pow()
进行截断。
考虑long int lround(double x)
,long int lroundf(float x)
在一次调用中舍入并转换为整数类型。
lround
和llround
函数将它们的参数四舍五入到最接近的整数值,无论当前的舍入方向如何,都将中间情况四舍五入。 C11§7.12.9.72
n2 = lround(pow(10,n));
a1 = a*n2;
n1 = lroundf(a1);