BigFloat 计算在不同的机器上产生不同的结果
BigFloat calculations produce different results in various machines
我在我的项目中使用第三方库来获取 BigFloat 值(我使用了这两个库 https://github.com/Osinko/BigFloat and https://www.nuget.org/packages/BigFloat)。我在我的机器上得到的结果是想要的结果;但是,当我 运行 其他机器上的应用程序(我在 3 台不同的机器上测试)时,应用程序给出了不同的结果(所有三台机器都给出了相同的数字,这与我在我的机器上得到的值不同并且不是我的应用程序可接受的值)。
我研究了各种关于浮点计算在不同机器上的不同结果的帖子,但是在所有三台机器上产生的结果都是一样的。所以,我想知道我是否遗漏了什么。或者,我该如何解决这个问题?
执行计算的函数部分是(thisItemCount、count_system、userDuration、repairTime、MTBFValue 和 workingRate 值是我从用户通过表单输入得到的两倍):
// Calculate the effective total failure rate
double FailureRate = (thisItemCount * Count_system * useDuration * repairTime) /
(MTBFvalue / workingRate);
//FailureRate = Math.Round(FailureRate, 8, MidpointRounding.AwayFromZero);
// Calculate the required number of spares
int n = 0;
BigFloat failureProbability = 0;
BigFloat adequacy = 0;
for (int j = 0; j < 150; j++)
{
try
{
BigFloat power = BigFloat.Pow(FailureRate, n);
failureProbability = power / Factorial(n);
adequacy += failureProbability;
BigFloat Exp = (BigFloat)(Math.Exp(-FailureRate));
BigFloat FA = Exp * adequacy;
double Level = _spareAvailability / 100;
BigFloat AvailabilityLevel = new BigFloat(Level);
if (FA >= AvailabilityLevel)
{
Console.WriteLine("Break");
break;
}
n++;
}
catch (Exception ex)
{
Console.WriteLine("Didn't calculate this row");
Console.WriteLine(ex);
}
}
result.Text = n.ToString();
这可能是这台机器的文化。
在您的源代码中明确文化,然后重试。
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); // your culture
我在我的项目中使用第三方库来获取 BigFloat 值(我使用了这两个库 https://github.com/Osinko/BigFloat and https://www.nuget.org/packages/BigFloat)。我在我的机器上得到的结果是想要的结果;但是,当我 运行 其他机器上的应用程序(我在 3 台不同的机器上测试)时,应用程序给出了不同的结果(所有三台机器都给出了相同的数字,这与我在我的机器上得到的值不同并且不是我的应用程序可接受的值)。 我研究了各种关于浮点计算在不同机器上的不同结果的帖子,但是在所有三台机器上产生的结果都是一样的。所以,我想知道我是否遗漏了什么。或者,我该如何解决这个问题?
执行计算的函数部分是(thisItemCount、count_system、userDuration、repairTime、MTBFValue 和 workingRate 值是我从用户通过表单输入得到的两倍):
// Calculate the effective total failure rate
double FailureRate = (thisItemCount * Count_system * useDuration * repairTime) /
(MTBFvalue / workingRate);
//FailureRate = Math.Round(FailureRate, 8, MidpointRounding.AwayFromZero);
// Calculate the required number of spares
int n = 0;
BigFloat failureProbability = 0;
BigFloat adequacy = 0;
for (int j = 0; j < 150; j++)
{
try
{
BigFloat power = BigFloat.Pow(FailureRate, n);
failureProbability = power / Factorial(n);
adequacy += failureProbability;
BigFloat Exp = (BigFloat)(Math.Exp(-FailureRate));
BigFloat FA = Exp * adequacy;
double Level = _spareAvailability / 100;
BigFloat AvailabilityLevel = new BigFloat(Level);
if (FA >= AvailabilityLevel)
{
Console.WriteLine("Break");
break;
}
n++;
}
catch (Exception ex)
{
Console.WriteLine("Didn't calculate this row");
Console.WriteLine(ex);
}
}
result.Text = n.ToString();
这可能是这台机器的文化。
在您的源代码中明确文化,然后重试。
CultureInfo.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); // your culture