相关疑难解决方法(0)

如何计算整数的除法和模数?

如何计算C#中整数的除法和模数?

c#

79
推荐指数
4
解决办法
27万
查看次数

80位扩展精度数据类型有哪些应用/优点?

是的,我的意思是说80位.这不是一个错字......

我对浮点变量的经验总是涉及4字节的倍数,如单音(32位),双音(64位)和长双音(我已经看到它被称为96位或128位).这就是为什么当我遇到一些代码来读取和写入AIFF(音频交换文件格式)文件时遇到80位扩展精度数据类型时我有点困惑:选择了一个扩展精度变量来存储采样音轨的速率.

当我浏览维基百科时,我发现上面的链接以及IEEE 754-1985标准摘要中的80位格式的简要提及(但不在IEEE 754-2008标准摘要中).看来,在某些架构上,"扩展"和"长双"是同义词.

我没有遇到的一件事是使用扩展精度数据类型的特定应用程序(当然,AIFF文件采样率除外).这让我想知道:

  • 有没有人遇到过扩展精度对某些编程应用来说是必要/有益的情况?
  • 80位浮点数有什么好处,除了显而易见的"它比双倍的精度稍高但比大多数长双精度的实现更少"?
  • 它的适用性正在减弱吗?

floating-point ieee-754

15
推荐指数
3
解决办法
5440
查看次数

为什么C#中的浮点运算不精确?

为什么以下程序会打印出打印的内容?

class Program
{
    static void Main(string[] args)
    {
        float f1 = 0.09f*100f;
        float f2 = 0.09f*99.999999f;

        Console.WriteLine(f1 > f2);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是

false
Run Code Online (Sandbox Code Playgroud)

c# floating-point

13
推荐指数
3
解决办法
2万
查看次数

Math.Pow计算不正确

我遇到了C#的问题.准确地说Math.pow().如果我试着计算15 ^ 14那么我得到"29192926025390624".但如果我用Wolfram Alpha计算它,我会得到"29192926025390625".正如您所看到的,唯一的区别是1个数字.Wolfram Alpha是正确的.为什么不是C#?以及如何解决这个问题,以便在C#中获得正确的值?7

我的代码非常简单,因为我只是尝试使用硬编码的示例.所以我正在做的是:Math.Pow(15,14);这给了29192926025390624.而不是"29192926025390625"这是正确的答案.

链接:Wolfram Alpha

c# pow

10
推荐指数
2
解决办法
7266
查看次数

Microsoft ACE驱动程序更改程序其余部分的浮点精度

我遇到一个问题,在使用Microsoft ACE驱动程序打开Excel电子表格后,某些计算结果似乎发生了变化.

下面的代码重现了这个问题.

前两次调用DoCalculation产生相同的结果.然后我调用OpenSpreadSheet使用ACE驱动程序打开和关闭Excel 2003电子表格的函数.你不会期望OpenSpreadSheet对最后一次调用产生任何影响,DoCalculation但事实证明结果实际上发生了变化.这是程序生成的输出:

1,59142713593566
1,59142713593566
1,59142713593495
Run Code Online (Sandbox Code Playgroud)

请注意最后3位小数的差异.这似乎不是一个很大的区别,但在我们的生产代码中,计算是复杂的,并且产生的差异非常大.

如果我使用JET驱动程序而不是ACE驱动程序没有区别.如果我将类型从double更改为十进制,则错误消失.但这不是我们的生产代码中的一个选项.

我在Windows 7 64位上运行,程序集是为.NET 4.5 x86编译的.使用64位ACE驱动程序不是一个选项,因为我们运行的是32位Office.

有谁知道为什么会发生这种情况以及如何解决这个问题?

以下代码重现了我的问题:

static void Main(string[] args)
{
    DoCalculation();
    DoCalculation();
    OpenSpreadSheet();
    DoCalculation();
}

static void DoCalculation()
{
    // Multiply two randomly chosen number 10.000 times.
    var d1 = 1.0003123132;
    var d3 = 0.999734234;

    double res = 1;
    for (int i = 0; i < 10000; i++)
    {
        res *= d1 * d3;
    }
    Console.WriteLine(res);
}

public …
Run Code Online (Sandbox Code Playgroud)

.net floating-point excel jet

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

标签 统计

c# ×3

floating-point ×3

.net ×1

excel ×1

ieee-754 ×1

jet ×1

pow ×1