Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的浮点数学舍入+;与mathematica相比 下面的帖子被解决了,因为读者对公式的解释错误而产生的问题被强烈地鼓励考虑页面:< /强> _C++_C++11_Random_Wolfram Mathematica_Random Sample - Fatal编程技术网

C++ C+中的浮点数学舍入+;与mathematica相比 下面的帖子被解决了,因为读者对公式的解释错误而产生的问题被强烈地鼓励考虑页面:< /强>

C++ C+中的浮点数学舍入+;与mathematica相比 下面的帖子被解决了,因为读者对公式的解释错误而产生的问题被强烈地鼓励考虑页面:< /强> ,c++,c++11,random,wolfram-mathematica,random-sample,C++,C++11,Random,Wolfram Mathematica,Random Sample,我有以下奇怪的现象,这让我很困惑 我有一个分段常数概率密度,如下所示 using RandomGenType = std::mt19937_64; RandomGenType gen(51651651651); using PREC = long double; std::array<PREC,5> intervals {0.59, 0.7, 0.85, 1, 1.18}; std::array<PREC,4> weights {1.36814, 1.99139, 0.

我有以下奇怪的现象,这让我很困惑

我有一个分段常数概率密度,如下所示

using RandomGenType = std::mt19937_64;
RandomGenType gen(51651651651);

using PREC = long double;
std::array<PREC,5> intervals {0.59, 0.7, 0.85, 1, 1.18};
std::array<PREC,4> weights {1.36814, 1.99139, 0.29116, 0.039562};

 // integral over the pdf to normalize:
PREC normalization =0;
for(unsigned int i=0;i<4;i++){
    normalization += weights[i]*(intervals[i+1]-intervals[i]);
}
std::cout << std::setprecision(30) << "Normalization: " << normalization << std::endl;
// normalize all weights (such that the integral gives 1)!
for(auto & w : weights){
    w /= normalization;
}

std::piecewise_constant_distribution<PREC>
distribution (intervals.begin(),intervals.end(),weights.begin());
我得到的质量=4.3283 kg(见现场)

在Mathematica中做完全相同的事情,比如:

给出了4.5287 kg的假定正确值。(见附件)

这不一样,也有不同的种子,C++和Mathematica永远不匹配!是不是数字不准确,我怀疑这是。。。? <强>问题:C++中的采样错误是什么?<强> < /p> 简单Mathematica代码:

pdf[r_] = 2*Piecewise[{{0, r < 0.59}, {1.36814, 0.59 <= r <= 0.7}, 
           {1.99139, Inequality[0.7, Less, r, LessEqual, 0.85]}, 
           {0.29116, Inequality[0.85, Less, r, LessEqual, 1]}, 
           {0.039562, Inequality[1, Less, r, LessEqual, 1.18]}, 
           {0, r > 1.18}}];

pdfr[r_] = pdf[r] / Integrate[pdf[r], {r, 0, 3}];(*normalize*)

Plot[pdf[r], {r, 0.4, 1.3}, Filling -> Axis]

PDFr = ProbabilityDistribution[pdfr[r], {r, 0, 1.18}]; 
(*if you put 1.18=2 then we dont get 4.52??*)

SeedRandom[100, Method -> "MersenneTwister"]
dataR = RandomVariate[PDFr, 1000000, WorkingPrecision -> MachinePrecision];
Fold[#1 + (2*#2*10^-3)^3  Pi/6 2400 &, 0, dataR] 

(*Analytical Solution*)

PDFr = ProbabilityDistribution[pdfr[r], {r, 0, 3}];
1000000 Integrate[ 2400 (2 InverseCDF[PDFr, p] 10^-3)^3 Pi/6, {p, 0, 1}]

文件在此处生成:

[以下段落经过编辑以确保正确性。--编者注]

Mathematica可以使用也可以不使用IEEE 754浮点数。从Wolfram文档中:

Wolfram语言具有复杂的内置自动数字精度和精度控制。但对于数值计算的特殊目的优化,或研究数值分析,Wolfram语言也允许对精度和准确性进行详细控制

Wolfram语言处理任意位数的整数和实数,并在适当时自动标记数字精度。Wolfram语言在内部使用了几种高度优化的数字表示法,但仍然为数字和精度操作提供了统一的接口,同时允许数值分析师在需要时研究表示法的细节


对于
std::分段常数分布
on,概率公式似乎写错了

权重之和在不乘以间隔长度的情况下完成

正确的公式是:


这解决了以前发现的每一个愚蠢的怪癖,比如bug/浮点错误等等

你说的“不同的种子我永远不会得到相同的种子”是什么意思?如果每种情况下的随机数不同,为什么会得到相同的随机数总和?这是如何接近“尽可能多”的呢。你有没有展示过它在两个时间间隔内发生或不发生?即使是一个间隔,你也应该对你的C++代码生成的随机数进行直方图,并将它们与预期的PDF进行比较。这有助于进一步诊断发生了什么。当我随机分配种子时,你的代码给出的结果范围在4.32788千克到4.33053千克之间,所以你是对的,在某个地方有一个怪癖。我的钱是浮点不准确的。C++ PixeWeSeistangTyx分布看起来不错:所有的范围都在百分之一的期望值中的第五。如果只是用Mathematica(64位双倍)生成的随机数“C++使用IEEE 754浮点数字”,我只是在做一个测试。
分段常数分布::密度()
返回的密度按其相应间隔的宽度缩放。你的计算没有考虑到这一点。在您的示例中,第二个层段的密度应该是第一个层段的四倍,因为它的重量是第一个层段重量的两倍,并且层段的宽度是第一个层段宽度的一半。对于
分段常数分布返回的密度,此关系与预期一样成立,但对于您的计算不成立。Jason您应该删除此注释,因为它不再适用于帖子。谢谢你的很好的输入,maybee将其添加到顶部
pdf[r_] = 2*Piecewise[{{0, r < 0.59}, {1.36814, 0.59 <= r <= 0.7}, 
           {1.99139, Inequality[0.7, Less, r, LessEqual, 0.85]}, 
           {0.29116, Inequality[0.85, Less, r, LessEqual, 1]}, 
           {0.039562, Inequality[1, Less, r, LessEqual, 1.18]}, 
           {0, r > 1.18}}];

pdfr[r_] = pdf[r] / Integrate[pdf[r], {r, 0, 3}];(*normalize*)

Plot[pdf[r], {r, 0.4, 1.3}, Filling -> Axis]

PDFr = ProbabilityDistribution[pdfr[r], {r, 0, 1.18}]; 
(*if you put 1.18=2 then we dont get 4.52??*)

SeedRandom[100, Method -> "MersenneTwister"]
dataR = RandomVariate[PDFr, 1000000, WorkingPrecision -> MachinePrecision];
Fold[#1 + (2*#2*10^-3)^3  Pi/6 2400 &, 0, dataR] 

(*Analytical Solution*)

PDFr = ProbabilityDistribution[pdfr[r], {r, 0, 3}];
1000000 Integrate[ 2400 (2 InverseCDF[PDFr, p] 10^-3)^3 Pi/6, {p, 0, 1}]
file = NotebookDirectory[] <> "numbersCpp.bin";
dataCPP = BinaryReadList[file, "Real64"];
Hpdf = HistogramDistribution[dataCPP];
h = DiscretePlot[  PDF[ Hpdf, x], {x, 0.4, 1.2, 0.001}, 
   PlotStyle -> Red];
Show[h, p, PlotRange -> All]