标签: double-precision

何时在java中使用expm1而不是exp

我对在java中使用expm1函数感到困惑Math.expm1的Oracle java doc说:

返回exp(x)-1.注意,对于接近0的x的值,expm1(x)+ 1的精确和更接近ex的真实结果而不是exp(x).

但是这个页面说:

但是,对于x的负值,大约为-4和更低,用于计算Math.exp()的算法相对不良,并且会受到舍入误差的影响.使用不同的算法计算ex - 1然后在最终结果中加1是更准确的.

我们应该使用expm1(x)表示负x值还是接近0值?

java double-precision exp

6
推荐指数
2
解决办法
1947
查看次数

格式化使用DecimalFormat在没有科学记数法的情况下打印Double

我一直在读取传感器读数的时间戳值,但由于它们以纳秒为单位提供,我认为我会将它们转换为加倍并进行转换.结果数字是一个17位数值加上分隔符.

试图直接打印它会产生科学记数法,这是我不想要的,因此我使用DecimalFormat类将其输出到4位小数的预期值.问题是,即使调试器显示了17个十进制数字,即使在'doubleValue()'调用之后,输出字符串也会显示15个数字.

码:

...
Double timestamp = (new Date().getTime()) +       // Example: 1.3552299670232847E12
            ((event.timestamp - System.nanoTime()) / 1000000D);
DecimalFormat dfmt = new DecimalFormat("#.####");

switch(event.sensor.getType()){
    case Sensor.TYPE_LINEAR_ACCELERATION:
    case Sensor.TYPE_ACCELEROMETER:
        accel = event.values.clone();
        String line = "A" + LOGSEPARATOR +              
            dfmt.format(timestamp.doubleValue()) + // Prints: 1355229967023.28
...
Run Code Online (Sandbox Code Playgroud)

我认为这可能是一个Android精度问题,但调试器的格式化程序也显示错误的精度.我在本地java程序中测试了这个,并且两个调用具有相同的数字量.

这是一个DecimalFormat错误/限制吗?或者我做错了什么?

java android string-formatting floating-accuracy double-precision

6
推荐指数
1
解决办法
5928
查看次数

我怎么能相信从double转换为整数?

我一直在研究一些用于创建直方图的简单代码,并发现以下代码:

double value = 1.2;
double bucketSize = 0.4;
double bucketId = value / bucketSize;

std::cout << "bucketId as double: " << bucketId << std::endl;
std::cout << "bucketId as int: " << int(bucketId) << std::endl;
Run Code Online (Sandbox Code Playgroud)

导致疯狂的输出:

bucketId as double: 3
bucketId as int: 2
Run Code Online (Sandbox Code Playgroud)

寻找合适的时候);这基本上毁了我的电脑信任bucketIdvalue同时,创建直方图.

我知道存在舍入错误等但是这个问题是否有任何通用解决方案?

(以防万一)请不要建议0.5在施法前添加分区的结果,int因为在某些情况下它显然不能很好地工作(例如double value = 3; double bucketSize = 2;)

提前致谢.

c++ casting division double-precision

6
推荐指数
1
解决办法
2107
查看次数

是否有acos()函数的精确近似值?

我需要acos()一个计算着色器中具有双精度的函数.由于acos()GLSL中没有内置函数具有双精度,我试图实现自己的.

起初,我实施了一个泰勒系列,如维基 - 泰勒系列中的方程式,具有预先计算的教师价值.但这似乎在1左右不准确.最大误差约为0.08,有40次迭代.

我也实现了这种在CPU上工作得很好的方法,最大误差为-2.22045e-16,但是我在着色器中实现这个有一些麻烦.

目前,我正在使用此处acos()近似函数,其中有人在站点上发布了他的近似函数.我正在使用这个网站最准确的功能,现在我得到的最大误差为-7.60454e-08,但错误也太高了.

我的这个函数的代码是:

double myACOS(double x)
{
    double part[4];
    part[0] = 32768.0/2835.0*sqrt(2.0-sqrt(2.0+sqrt(2.0+sqrt(2.0+2.0*x))));
    part[1] = 256.0/135.0*sqrt(2.0-sqrt(2.0+sqrt(2.0+2.0*x)));
    part[2] = 8.0/135.0*sqrt(2.0-sqrt(2.0+2.0*x));
    part[3] = 1.0/2835.0*sqrt(2.0-2.0*x);
    return (part[0]-part[1]+part[2]-part[3]);
}
Run Code Online (Sandbox Code Playgroud)

有没有人知道另一种实现方法acos()是非常准确的 - 如果可能 - 很容易在着色器中实现?

一些系统信息:

  • Nvidia GT 555M
  • 使用optirun运行OpenGL 4.3

opengl shader trigonometry glsl double-precision

6
推荐指数
2
解决办法
1405
查看次数

C#高双精度

我正在编写一个计算PI值的函数,并将其作为double返回.到现在为止还挺好.但是一旦函数在小数位后达到14位,就不能再保持.我假设这是因为双精度有限.我应该怎么做才能在小数点后继续获得更多数字?

c# double double-precision

5
推荐指数
2
解决办法
6523
查看次数

Fortran双精度程序,带有简单的MKL BLAS程序

在尝试在一个简单的程序中混合精度 - 使用真实和双重 - 并使用BLAS的ddot例程时,我想出了双精度部分的错误输出.这是代码:

program test

!! adding this statement narrowed the issue down to ddot being considered real(4)
implicit none

integer, parameter :: dp = kind(1.0d0)

!! The following 2 lines were added for the calls to the BLAS routines.
!! This fixed the issue.
real(dp), external :: ddot
real, external :: sdot

real, dimension(3) :: a,b
real(dp), dimension(3) :: d,e

integer :: i

do i = 1,3
    a(i) = 1.0*i
    b(i) = 3.5*i
    d(i) = 1.0d0*i
    e(i) …
Run Code Online (Sandbox Code Playgroud)

fortran blas double-precision intel-mkl

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

主机到网络双?

我想通过网络发送一些双精度浮点数.(标准C,标准套接字)没有htond或ntohd将数据转换为网络字节顺序和从网络字节顺序转换数据.我该怎么办?我脑子里有几个解决方案,但我想知道常见的做法是什么.

(我也想知道发送64位整数的常见做法,比如gstreamer使用的gint64值)

编辑:这是我想到的一个解决方案.我认为它适用于任何大小的整数,但它是否适合双打?

void swap_if_necessary (void* buff, int buff_len) 
{
    uint32_t foo = 1;
    if ( htonl(foo) != foo ) 
    {
        char* to_swap = (char*)buff;

        int i;
        for (i = 0; i < buff_len/2; i++)
        {
            char  swap_buff = to_swap[i];
            to_swap[i] = to_swap[buff_len -1 -i];  
            to_swap[buff_len -1 -i] = swap_buff;
        }  
    }
}
Run Code Online (Sandbox Code Playgroud)

c sockets double double-precision htonl

5
推荐指数
2
解决办法
5515
查看次数

如何知道双字符串是否往返安全?

我有一个 double 的文本表示,想知道将它往返于 double 和 back 是否安全。如果我也想接受任何类型的输入类型,我怎么知道这一点?或者我怎么知道当用 Double.Parse 解析双字符串时是否有任何精度丢失?或者我如何 ToString a double 以匹配与另一个双字符串相同的格式?对这些问题中的任何一个的回答将是我认为的解决方案。

c# double parsing double-precision

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

使用双精度浮点精确到2 ^ 53实现整数乘法吗?

我问,因为我正在计算矩阵乘法,其中所有矩阵值都是整数.

我想使用LAPACK,以便获得正确的快速代码.将两个大整数(其乘积小于2^53)整数存储为doubles时,会产生double包含精确整数结果的整数吗?

math floating-point linear-algebra double-precision lapack

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

new BigDecimal(double)vs new BigDecimal(String)

何时BigDecimal使用输入doubleBigDecimal输入String不同的结果似乎出现.

BigDecimal a = new BigDecimal(0.333333333);
BigDecimal b = new BigDecimal(0.666666666);

BigDecimal c = new BigDecimal("0.333333333");
BigDecimal d = new BigDecimal("0.666666666");

BigDecimal x = a.multiply(b);
BigDecimal y = c.multiply(d);

System.out.println(x);
System.out.println(y);
Run Code Online (Sandbox Code Playgroud)

x输出为

0.222222221777777790569747304508155316795087227497352441864147715340493949298661391367204487323760986328125
Run Code Online (Sandbox Code Playgroud)

而你是

0.222222221777777778
Run Code Online (Sandbox Code Playgroud)

我错误地说这是因为双重不精确?但既然这是一个BigDecimal,不应该是一样的吗?

java bigdecimal double-precision

5
推荐指数
3
解决办法
3872
查看次数