标签: floating-accuracy

将`std :: floor()`和`std :: ceil()`转换为整数类型总能得到正确的结果吗?

我是偏执狂,其中一个函数可能会给出一个不正确的结果:

std::floor(2000.0 / 1000.0) --> std::floor(1.999999999999) --> 1
or
std::ceil(18 / 3) --> std::ceil(6.000000000001) --> 7
Run Code Online (Sandbox Code Playgroud)

可以这样的事情发生吗?如果确实存在这样的风险,我打算使用以下功能以便安全地工作.但是,这真的有必要吗?

constexpr long double EPSILON = 1e-10;

intmax_t GuaranteedFloor(const long double & Number)
{
    if (Number > 0)
    {
        return static_cast<intmax_t>(std::floor(Number) + EPSILON);
    }
    else
    {
        return static_cast<intmax_t>(std::floor(Number) - EPSILON);
    }
}

intmax_t GuaranteedCeil(const long double & Number)
{
    if (Number > 0)
    {
        return static_cast<intmax_t>(std::ceil(Number) + EPSILON);
    }
    else
    {
        return static_cast<intmax_t>(std::ceil(Number) - EPSILON);
    }
}
Run Code Online (Sandbox Code Playgroud)

(注意:我假设给定的'long double'参数适合'intmax_t'返回类型.)

c++ math arithmetic-expressions floating-accuracy

16
推荐指数
1
解决办法
3432
查看次数

如何在Perl中设置浮点精度?

有没有办法设置Perl脚本的浮点精度(3位数),而不必专门为每个变量更改它?

类似于TCL的东西:

global tcl_precision
set tcl_precision 3
Run Code Online (Sandbox Code Playgroud)

floating-point perl floating-accuracy

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

以不同顺序添加相同的双精度时的结果不同

为什么添加相同数字时输出会有所不同?

public class Test {

    public static void main(String a[]) {

        double[] x = new double[]{3.9, 4.3, 3.6, 1.3, 2.6};
        System.out.println(">>>>>>> " + sum(x));
    }

    public static double sum(double[] d) {

        double sum = 0;
        for (int i = 0; i < d.length; i++) {
            sum += d[i];
        }
        return sum;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出是: 15.7

如果我交换价值观

double[] x = new double[] {2.6, 3.9, 4.3, 3.6, 1.3};
Run Code Online (Sandbox Code Playgroud)

我得到输出为: 15.700000000000001

如何获得相同的输出?

java floating-point floating-accuracy

15
推荐指数
1
解决办法
1870
查看次数

为什么我需要17位有效数字(而不是16位)才能代表双倍数?

有人能给我一个浮点数(双精度)的例子,需要超过16个有效十进制数来表示它吗?

我在这个帖子中发现,有时候你需要多达17位,但我无法找到这样一个数字的例子(16对我来说似乎足够了).

有人可以澄清一下吗?

非常感谢!

c floating-accuracy

14
推荐指数
1
解决办法
5106
查看次数

为什么在Matlab和Octave中inv()和pinv()的输出不相等?

我注意到如果A是NxN矩阵并且它具有逆矩阵.但是inv()和pinv()函数输出是不同的. - 我的环境是Win7x64 SP1,Matlab R2012a,Cygwin Octave 3.6.4,FreeMat 4.2

看看Octave的例子:

A = rand(3,3)
A =
0.185987   0.192125   0.046346
0.140710   0.351007   0.236889
0.155899   0.107302   0.300623

pinv(A) == inv(A)
ans =
0 0 0
0 0 0
0 0 0
Run Code Online (Sandbox Code Playgroud)
  • 这一切都同ans通过上面运行在Matlab同一命令的结果.

  • 我计算inv(A)*AA*inv(A),结果是Octave和Matlab中的身份3x3矩阵.
  • 结果A*pinv(A)pinv(A)*A在Matlab和FreeMat身份3x3矩阵.
  • 的结果 A*pinv(A)是Octave中的身份3x3矩阵.
  • 结果pinv(A)*A不是在倍频身份3x3矩阵.

我不知道原因 inv(A) != pinv(A),我已经考虑了矩阵中元素的细节.这似乎是导致这个问题的浮动精度问题.

点点后10位数可能不同,如下所示:

  • 6.65858991579923298331777914427220821380615200000000inv(A)(1,1)反对的元素

  • 6.65858991579923209513935944414697587490081800000000 元素 pinv(A)(1,1)

precision matlab floating-accuracy matrix-inverse numerical-analysis

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

乘以0.0000001乘以10000000相同?

在Java中,将倍数乘以0.0000001,将其除以10000000?我的直觉是可能存在差异,因为0.0000001不能完全用双精度表示.

java floating-accuracy

14
推荐指数
1
解决办法
455
查看次数

在Swift中获取double的小数部分

我试图在swift中分隔double的十进制和整数部分.我尝试了很多方法,但它们都遇到了同样的问题......

let x:Double = 1234.5678
let n1:Double = x % 1.0           // n1 = 0.567800000000034
let n2:Double = x - 1234.0        // same result
let n3:Double = modf(x, &integer) // same result
Run Code Online (Sandbox Code Playgroud)

有没有办法获得0.5678而不是0.567800000000034而无需将数字转换为字符串?

math floating-accuracy swift

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

为什么这个计算在boost :: thread和std :: thread中给出不同的结果?

执行此浮点计算时boost::thread,它会产生与std::thread在主线程中或主线程中执行时不同的结果.

void print_number()
{
    double a = 5.66;
    double b = 0.0000001;
    double c = 500.4444;
    double d = 0.13423;
    double v = std::sin(d) * std::exp(0.4 * a + b) / std::pow(c, 2.3);

    printf("%llX\n%0.25f\n", *reinterpret_cast<unsigned long long*>(&v), v);
}
Run Code Online (Sandbox Code Playgroud)

这似乎是因为boost::thread默认情况下使用53位内部精度进行浮点数学运算,而主线程使用的是64位精度.如果在创建_fpreset()后重置FPU单元的状态boost::thread,则结果与主线程中的结果相同.

我正在使用Embarcadero C++ Builder 10.1(编译器bcc32c版本3.3.1)和Boost 1.55.0.我的环境是Windows 7,我正在构建32位Windows目标.

工作范例:

#include <tchar.h>
#include <thread>
#include <boost/thread.hpp>
#include <cstdio>
#include <cmath>
#include <cfloat>

namespace boost { void tss_cleanup_implemented() {} }

void print_number()
{
    double …
Run Code Online (Sandbox Code Playgroud)

c++ c++builder floating-accuracy boost-thread

14
推荐指数
2
解决办法
492
查看次数

浮点格式会受big-endian和little endian的影响吗?

我知道big-endian机器和little-endian机器之间的整数格式会有所不同,浮点格式(IEEE 754)是否相同?

c c++ floating-accuracy

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

为什么Ruby的Float#round行为与Python不同?

" Python中"round"函数的行为 "观察到Python循环浮动如下:

>>> round(0.45, 1)
0.5
>>> round(1.45, 1)
1.4
>>> round(2.45, 1)
2.5
>>> round(3.45, 1)
3.5
>>> round(4.45, 1)
4.5
>>> round(5.45, 1)
5.5
>>> round(6.45, 1)
6.5
>>> round(7.45, 1)
7.5
>>> round(8.45, 1)
8.4
>>> round(9.45, 1)
9.4
Run Code Online (Sandbox Code Playgroud)

接受的答案证实这是由于浮点数的二进制表示不准确引起的,这都是合乎逻辑的.

假设Ruby浮点数和Python一样不准确,那么Ruby如何像人类一样漂浮?Ruby欺骗了吗?

1.9.3p194 :009 > 0.upto(9) do |n|
1.9.3p194 :010 >     puts (n+0.45).round(1)
1.9.3p194 :011?>   end
0.5
1.5
2.5
3.5
4.5
5.5
6.5
7.5
8.5
9.5
Run Code Online (Sandbox Code Playgroud)

ruby python rounding floating-accuracy

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