小编Woj*_*iec的帖子

将小(1.0E-12)数字存储为科学计数法的双精度数

这是设置:

对于我的学士论文,我想测试大型强子对撞机使用的喷射算法.基本上第一步是下面的步骤:给出一些4动量

p[0] = nullvector(45.0000000000106,33.03951484238976,14.97124733712793,26.6317895033428)
Run Code Online (Sandbox Code Playgroud)

我想通过在10 ^( - 12)的顺序中将一些(如50个)随机生成的4向量添加到最后三个组件来模拟实验数据,这样它们就很小(这就是有趣物理发生的地方),但是显着高于15位小数的双浮点精度.因此,快速而肮脏的解决方案如下:

seed=time(NULL);
srand(seed);
random=(rand()%9001)*1.0E-15;
random=random+1E-12;
printf("%.15E\n",random);
Run Code Online (Sandbox Code Playgroud)

这给出了1E-12和10E-12(= 1E-11)之间的随机数,最大值为三位小数,因此在"实际"双精度数中,这给出了15位小数.

现在到了这一点:我可以按顺序存储数字超过三位小数而不超出双浮点精度吗?

PS:有没有更好的方法来生成小的随机数?(这听起来像另一个主题;))

c double scientific-notation

5
推荐指数
1
解决办法
888
查看次数

正确定义常量

我在以正确的方式定义我在代码中使用的常量时遇到了一些麻烦.虽然我阅读了优秀的帖子Jonathan Leffler,但我如何使用extern在源文件之间共享变量?,我似乎误解了一些东西.这是设置:

/*   constants.h   */
extern int NUM_PARTICLES;
extern int LIGHTSPEED;
Run Code Online (Sandbox Code Playgroud)

这个头用在random.hmain.c中,看起来像

#include "constants.h"
int NUM_PARTICLES=104;
Run Code Online (Sandbox Code Playgroud)

random.h

#include "constants.h"
int LIGHTSPEED=104;
Run Code Online (Sandbox Code Playgroud)

main.c,分别.NUM_PARTICLES用于main.c中

30:  double ghosts[NUM_PARTICLES][4];
31:  double output[NUM_PARTICLES][3];
Run Code Online (Sandbox Code Playgroud)

虽然这件事有效但我收到以下警告,

main.c: In function ‘int main()’:
main.c:30:32: warning: ISO C++ forbids variable length array ‘ghosts’ [-Wvla]
main.c:31:32: warning: ISO C++ forbids variable length array ‘output’ [-Wvla]
Run Code Online (Sandbox Code Playgroud)

这很奇怪,因为在我看来,我确实给数组一个在编译时已知的常数值.(通常这些数组长度错误会导致一些段错误,在这种情况下它们不会.)任何想法?

c arrays global-variables

1
推荐指数
1
解决办法
74
查看次数