小编Fer*_*own的帖子

在.net 4.5.2中对Math.Exp或双重实现的更改

如果我运行声明

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

为了清楚起见:字符串转换无关紧要......无论是否涉及字符串转换,我都会得到结果的更改.我提到这纯粹是为了证明这种变化.

c# precision .net-4.5.2

24
推荐指数
2
解决办法
1096
查看次数

如何检测循环中的任务

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,因为不可能完成所有任务。

我的问题是 - 有没有办法使用任务并行库来检测任务在循环中等待的情况,最好是禁止它?

(这是为了让我们通过重用现有任务来检测循环区域)

.net c# task-parallel-library

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

标签 统计

c# ×2

.net ×1

.net-4.5.2 ×1

precision ×1

task-parallel-library ×1