在以下部分代码中:
我想生成一个随机数" U"从0到1的范围, 然后我计算一个有log
的方程式错误是:U的某个值使等式中的对数给出"而不是数字"值
我试过施展" U"浮动或加倍或甚至将其舍入到2位小数但相同的错误
vector <double>Xs;//random Xs
double x;
double U;
while (check_arr < 360)
{
U = ((rand() / RAND_MAX) * 100) / 100;
x = (log10(1 - U)) / (-1 / a);
Xs.push_back(x);
}
答案 0 :(得分:4)
您的代码存在多个问题。
rand()返回一个整数,RAND_MAX是一个整数,所以当你划分它们时你会得到一个几乎总是为零的整数(因为rand()可以产生值RAND_MAX - 一次在2 ^ 31上我的计算机 - 该部门将产生1)。
接下来,乘以然后除以100无效。结果将是相同的:一个几乎总是0的整数,有时是1。
最后,您必须避免将log10设为零。不允许使用此值并将提高除零异常(同样,负值会引发无效的浮点异常)。
也许您可以使用以下表达式:
U = (rand() % 100)/100.0;
这将为您提供U值,其分布范围为0.00到0.99(含)。当你拿到log10(1-U)时,你不会得到例外。
答案 1 :(得分:1)
log10()将返回“not a number”。当我在我的机器上运行该方法时,我得到的结果是“-1。#INF000000000000”。 log(0)
是无效的号码。您可以通过在PC上打开计算器来验证这一点(如果您使用的是Windows),切换到科学模式然后尝试记录0。
数学解释:
log base 10函数用于帮助查找y
中的指数10^y=x
。因此,当您尝试在函数中插入0时,您正试图找到以下解决方案:
10^y=0
但是没有解决方案,因此该函数将返回无效数字。如果将x值的范围设置为0 <更好,那会更好。 x&lt; = 1,因此您不会遇到同样的问题。
由于rand函数返回的值介于0和RAND-MAX
之间,因此您可以使用以下内容确保不会在日志函数中输入0:
U = (rand() % 100 + 1)/100;
这将返回0.01和1的范围。您可以乱用数字来增加/减小范围。