鱼C论坛

 找回密码
 立即注册
查看: 1464|回复: 8

[已解决]c预定义问题

[复制链接]
发表于 2022-9-19 15:19:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
请教各位大神,

我在读别人代码时遇到以下预定义语句,其中v是一个结构体变量,包含val,sum,sum2 这三个real类型数据,n是int型参数

before:

  1. #define PropAvg(v, n) \
  2.    v.sum /= n, v.sum2 = sqrt (Max (v.sum2 / n - Sqr (v.sum), 0.))
复制代码

即PropAvg这个函数把v的sum2运算后返还给v的sum2


但是当我对相关变量进行打印时(check 那行语句),即显示打印v.sum2, 以及 v.sum2等号右面内容,得到的结果却不同


  1. #define PropAvg(v, n) \
  2.    v.sum /= n, v.sum2 = sqrt (Max (v.sum2 / n - Sqr (v.sum), 0.));\
  3.   printf("Check if same  %f %f \n",      v.sum2,       sqrt (Max (v.sum2 / n - Sqr (v.sum), 0.)));\

复制代码


得到的结果是:
Check if same 0.146077 0.000000

请问这是什么原因呢?
最佳答案
2022-9-21 00:58:50
今天有点晚了,明天给你看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-9-19 15:27:16 | 显示全部楼层
发完整的代码,你不发完整的代码我们就没办法给你调试代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-19 15:53:37 | 显示全部楼层
人造人 发表于 2022-9-19 15:27
发完整的代码,你不发完整的代码我们就没办法给你调试代码

谢谢。
有好几个文件构成,所以请直接下载吧:
链接: https://pan.baidu.com/s/13h7lZvPcbc55j_KTREfsEw?pwd=p8wx 提取码: p8wx

相关预定义文件在src/in_mddefs.h文件中。

编译运行的话,直接./crun.sh




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-19 16:33:40 | 显示全部楼层
人造人 发表于 2022-9-19 15:27
发完整的代码,你不发完整的代码我们就没办法给你调试代码

谢谢。
文件比较多,请直接下载吧。

提取码4tdw


上面提到的预定义的文件在src/in_mddefs.h中

加压后直接运行./crun.sh

会得到类似这样的输出
usage ./crun.sh chp# hw#. i.e. ./crun.sh 02 1
NameList -- data
deltaT                0.00500000
density                0.800000
initUcell        20 20
stepAvg                100
stepEquil        0
stepLimit        10000
temperature        1.00000
----
lqtest  1 sum sum2 1.106495 1.224331   
lqtest  2 sum sum2 2.383097 2.854043   
lqtest  3 sum sum2 3.859806 5.034715   
lqtest  4 sum sum2 5.563714 7.938016   
lqtest  5 sum sum2 7.522566 11.775116   
lqtest  6 sum sum2 9.763801 16.798253   

....
----------------------
Check if same 0.000059 0.000000
------------------------
----------------------
Check if same 0.016839 0.000000
------------------------

(跑一两秒结束循环就好。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-21 00:58:50 | 显示全部楼层    本楼为最佳答案   
今天有点晚了,明天给你看看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-9-21 20:41:28 | 显示全部楼层
人造人 发表于 2022-9-21 00:58
今天有点晚了,明天给你看看

哦,非常感谢。不过已经查出问题在哪了。不用浪费时间了。实在不好意思。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-9-21 20:46:27 | 显示全部楼层
lqhenwunai 发表于 2022-9-21 20:41
哦,非常感谢。不过已经查出问题在哪了。不用浪费时间了。实在不好意思。

结果确实是0,没问题
把代码改成这样,然后你看我的调试过程
  1.     //PropAvg (totEnergy, stepAvg);

  2.      /*
  3.     totEnergy.sum /= stepAvg;
  4.     totEnergy.sum2 = sqrt (Max (totEnergy.sum2 / stepAvg - Sqr (totEnergy.sum), 0.));
  5.     printf("Check if same%f %f \n",totEnergy.sum2,sqrt (Max (totEnergy.sum2 / stepAvg - Sqr (totEnergy.sum), 0.)));
  6.     */
  7.     totEnergy.sum /= stepAvg;
  8.     //totEnergy.sum2 = sqrt (Max (totEnergy.sum2 / stepAvg - Sqr (totEnergy.sum), 0.));
  9.     {
  10.         double a = Sqr(totEnergy.sum);
  11.         double b = totEnergy.sum2 / stepAvg;
  12.         double c = b - a;
  13.         double d = Max(c, 0);
  14.         totEnergy.sum2 = sqrt(d);
  15.     }
  16.     //printf("Check if same%f %f \n",totEnergy.sum2,sqrt (Max (totEnergy.sum2 / stepAvg - Sqr (totEnergy.sum), 0.)));
  17.     {
  18.         double a = Sqr(totEnergy.sum);
  19.         double b = totEnergy.sum2 / stepAvg;
  20.         double c = b - a;
  21.         double d = Max(c, 0);
  22.         double e = sqrt(d);
  23.         printf("Check if same%f %f \n", totEnergy.sum2, e);
  24.     }



  25.     PropAvg (kinEnergy, stepAvg);
  26. //  printf("~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
  27. //  printf("before %f %f\n",PropEst(pressure));
复制代码

  1. PropEst  100 sum sum2 457.510422 2166.029826

  2. Breakpoint 1, AccumProps (icode=2) at src/pr_02_1.c:323
  3. 323            totEnergy.sum /= stepAvg;
  4. (gdb) display totEnergy
  5. 1: totEnergy = {val = 0.99522634417443578, sum = 99.518657934111843, sum2 = 99.039636125322588}
  6. (gdb) display stepAvg
  7. 2: stepAvg = 100
  8. (gdb) n
  9. 326                double a = Sqr(totEnergy.sum);
  10. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 99.039636125322588}
  11. 2: stepAvg = 100
  12. (gdb) n
  13. 327                double b = totEnergy.sum2 / stepAvg;
  14. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 99.039636125322588}
  15. 2: stepAvg = 100
  16. (gdb) print a
  17. $1 = 0.9903963277006762
  18. (gdb) n
  19. 328                double c = b - a;
  20. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 99.039636125322588}
  21. 2: stepAvg = 100
  22. (gdb) print b
  23. $2 = 0.99039636125322583
  24. (gdb) n
  25. 329                double d = Max(c, 0);
  26. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 99.039636125322588}
  27. 2: stepAvg = 100
  28. (gdb) print c
  29. $3 = 3.3552549627557937e-08
  30. (gdb) n
  31. 330                totEnergy.sum2 = sqrt(d);
  32. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 99.039636125322588}
  33. 2: stepAvg = 100
  34. (gdb) print d
  35. $4 = 3.3552549627557937e-08
  36. (gdb) n
  37. 334                double a = Sqr(totEnergy.sum);
  38. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 0.00018317355056764593}
  39. 2: stepAvg = 100
  40. (gdb) n
  41. 335                double b = totEnergy.sum2 / stepAvg;
  42. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 0.00018317355056764593}
  43. 2: stepAvg = 100
  44. (gdb) print a
  45. $5 = 0.9903963277006762
  46. (gdb) n
  47. 336                double c = b - a;
  48. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 0.00018317355056764593}
  49. 2: stepAvg = 100
  50. (gdb) print b
  51. $6 = 1.8317355056764593e-06
  52. (gdb) n
  53. 337                double d = Max(c, 0);
  54. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 0.00018317355056764593}
  55. 2: stepAvg = 100
  56. (gdb) print c
  57. $7 = -0.99039449596517048
  58. (gdb) n
  59. 338                double e = sqrt(d);
  60. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 0.00018317355056764593}
  61. 2: stepAvg = 100
  62. (gdb) print d
  63. $8 = 0
  64. (gdb) n
  65. 339                printf("Check if same%f %f \n", totEnergy.sum2, e);
  66. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 0.00018317355056764593}
  67. 2: stepAvg = 100
  68. (gdb) print e
  69. $9 = 0
  70. (gdb) n
  71. Check if same0.000183 0.000000
  72. 344            PropAvg (kinEnergy, stepAvg);
  73. 1: totEnergy = {val = 0.99522634417443578, sum = 0.99518657934111843, sum2 = 0.00018317355056764593}
  74. 2: stepAvg = 100
  75. (gdb)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 14:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表