如果我运行声明
Math.Exp(113.62826122038274).ToString("R")
Run Code Online (Sandbox Code Playgroud)
在安装了.net 4.5.1的机器上,然后我得到答案
2.2290860617259248E+49
Run Code Online (Sandbox Code Playgroud)
但是,如果我在安装了.net framework 4.5.2的机器上运行相同的命令,那么我得到答案
2.2290860617259246E+49
Run Code Online (Sandbox Code Playgroud)
(即最后的数字变化)
我意识到这在纯数字术语中是无关紧要的,但有没有人知道在.net 4.5.2中所做的任何可以解释变化的变化?
(我不喜欢另一个结果,我只是想了解它为什么会改变)
如果我输出
The input in roundtrip format
The input converted to a long via BitConverter.DoubleToInt64Bits
Math.Exp in roundtrip format
Math.Exp converted to a long via BitConverter.DoubleToInt64Bits
Run Code Online (Sandbox Code Playgroud)
然后在4.5.1我得到
113.62826122038274
4637696294982039780
2.2290860617259248E+49
5345351685623826106
Run Code Online (Sandbox Code Playgroud)
在4.5.2我得到:
113.62826122038274
4637696294982039780
2.2290860617259246E+49
5345351685623826105
Run Code Online (Sandbox Code Playgroud)
所以对于完全相同的输入,我得到一个不同的输出(从位可以看出,因此不涉及往返格式)
更多细节:
使用VS2015编译一次
我运行二进制文件的两台机器都是64位
一个安装了.net 4.5.1,另一个安装了4.5.2
为了清楚起见:字符串转换无关紧要......无论是否涉及字符串转换,我都会得到结果的更改.我提到这纯粹是为了证明这种变化.
class Program
{
private static Task[] tasks;
static void Main(string[] args)
{
tasks = new Task[]
{
new Task(() => Task.WaitAll(tasks[1])),
new Task(() => Task.WaitAll(tasks[2])),
new Task(() => Task.WaitAll(tasks[0])),
};
tasks[0].Start();
tasks[1].Start();
tasks[2].Start();
Console.WriteLine(Task.WaitAll(tasks, 5000));
Console.ReadLine();
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的代码示例中,我设置了三个任务“a”、“b”、“c”,其中“a”等待“b”等待“c”等待“a”。
显然,WaitAll 然后返回 false,因为不可能完成所有任务。
我的问题是 - 有没有办法使用任务并行库来检测任务在循环中等待的情况,最好是禁止它?
(这是为了让我们通过重用现有任务来检测循环区域)