好吧,我已经编写了一个将字符串转换为十进制的代码
但是我不明白为什么当第一个断言工作正常时它会在第二个断言上进行核心转储
如果我打印出函数的返回值,它实际上返回了它应该返回的内容,但由于某种原因断言失败了
那么有人可以帮助我理解这里的断言是怎么回事吗?我不明白为什么它失败了?
这是代码
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <assert.h>
double myAtoD(char *);
int main(int argc, char *argv[]){
char *k="0.1";
char *l="0.141";
double m,n;
m = myAtoD(k);
n = myAtoD(l);
printf("%f\n",m);
assert(m==0.1);
printf("%f\n",n);
assert(n==0.141);
return 0;
}
double myAtoD (char *message){
int i=0;
int prior=0;
double num=0;
while(message[i]!='.'){
prior++;
i++;
}
i=0;
prior--;
while(message[i]!='\0'){
if(message[i]=='.')
i++;
printf("num is %f\nnew number to be added is %f\n\n",num, (message[i] - '0')*pow(10,prior));
num += (message[i] - '0')*pow(10,prior);
i++;
prior--;
}
return num;
}
最佳答案
您正在处理double
精度问题。
号码0.141
计算机无法准确表示,因此您必须检查它是否是小 epsilon
远离 0.141
相反。
这是一个更好的断言。
assert(abs(n-0.141) < DBL_EPSILON);
对于该常量,您需要输入 #include <float.h>
在源文件的顶部。
关于c - 程序的奇怪响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23987421/