c - 程序的奇怪响应

标签 c double assert

好吧,我已经编写了一个将字符串转换为十进制的代码

但是我不明白为什么当第一个断言工作正常时它会在第二个断言上进行核心转储

如果我打印出函数的返回值,它实际上返回了它应该返回的内容,但由于某种原因断言失败了

那么有人可以帮助我理解这里的断言是怎么回事吗?我不明白为什么它失败了?

这是代码

#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/

相关文章:

c - 操作系统、fork、共享内存和信号量

c - 获取指令指针指向的给定地址的指令

Java:如何设置 Double 的最大长度?

CMake:无法打开头文件

c++ - 带有双移位和以下移位运算的 C/C++ 除法

java - 解析非负 double

python - 类型错误 : Object of type Mock is not JSON serializable

delphi - 如何在发布版本中编译依赖于仅调试代码的assert()?

javascript - 断言属性不可配置

c - 同一类型的多个命令行参数