标签: numerical

使用浮点数进行最准确的线交点纵坐标计算?

我正在计算给定横坐标 x 上的点的纵坐标 y。该线由其两个端点坐标 (x0,y0)(x1,y1) 定义。端点坐标是浮点数,计算必须以浮点精度完成才能在 GPU 中使用。

数学,因此天真的实现,是微不足道的。

设 t = (x - x0)/(x1 - x0),然后 y = (1 - t) * y0 + t * y1 = y0 + t * (y1 - y0)。

问题是当 x1 - x0 小时。结果将引入取消错误。当与 x - x0 之一结合时,在除法中我预计 t 会出现重大错误。

问题是是否存在另一种更准确地确定 y 的方法?

即我应该先计算 (x - x0)*(y1 - y0),然后除以 (x1 - x0) 吗?

y1 - y0 的差值总是很大。

c c++ math optimization numerical

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

寻找接近的浮点数之间的“离散”差异

假设我有两个浮点数xy,它们的值非常接近。

计算机上可以表示离散数量的浮点数,因此我们可以按升序枚举它们:f_1, f_2, f_3, ...x我希望找到和在此列表中的距离y(即它们是 1、2、3、... 还是n离散步长?)

是否可以仅使用算术运算(+-*/)而不查看二进制表示来做到这一点?我主要感兴趣的是它在 x86 上的工作原理。

假设 和y > x之间x只有y几步(例如 < 100),下面的近似值是否正确?(可能不会 ...)

(y-x) / x / eps
Run Code Online (Sandbox Code Playgroud)

这里eps表示机器 epsilon。(机器 epsilon 是 1.0 和下一个最小浮点数之间的差。)

floating-point numerical x87

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

矢量化数学函数的免费/开源C/C++库?

我正在寻找类似于英特尔的Linux矢量数学库的免费/开源C/C++(可接受的)常用数学函数(如ln或exp)的矢量化版本库.我想要一个能够让我具备以下内容的库:

double a[ARRAY_SIZE], b[ARRAY_SIZE];
for (int i = 0; i < ARRAY_SIZE; ++i) {
    a[i] = ln(b[i]);
}
Run Code Online (Sandbox Code Playgroud)

如:

double a[ARRAY_SIZE], b[ARRAY_SIZE];
vectorized_ln(a, b, ARRAY_SIZE);
Run Code Online (Sandbox Code Playgroud)

并使用Intel和AMD架构上提供的SIMD指令的全部功能.开发环境包含在Linux上运行的GNU工具.英特尔的数学核心库包含一个名为矢量数学库的东西,它宣传"计算密集型核心数学函数的矢量实现",包括基本函数,触发函数等,所以我正在寻找类似的东西,但是免费的.

c c++ numerical simd

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

机器epsilon,ε:从1开始下一个较小值的步骤是什么?

我们知道机器epsilon,ε是"在给定浮点类型中可表示的1和最小值之间的差值".1

但是,该定义没有说明下一个较小的值.1和下一个较小的值有什么区别?


注意

1 ISO/IEC C 2011标准,第5.2.4.2.2节,第13段(对浮点没有权威性,但是机器epsilon的常见描述的一个例子).

floating-point numerical

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

Matlab和Numpy以及Python的'round`函数之间的差异

简化的问题

我可以让Numpy同意Matlab和Python round吗?

Matlab 2013a:

>> round(-0.5)
ans =
    -1
Run Code Online (Sandbox Code Playgroud)

Python(使用Numpy数组,或只是一个标量,相同的结果):

>>> import numpy
>>> round(numpy.array(-0.5))
-1.0
Run Code Online (Sandbox Code Playgroud)

Numpy,奇怪的是:

>>> import numpy
>>> numpy.round(numpy.array(-0.5))
-0
Run Code Online (Sandbox Code Playgroud)

圆形平台的这种差异是否依赖?

原始问题

Matlab附带一个包含一些音频数据的文件"handel.mat":

>> which handel.mat
C:\Program Files\MATLAB\R2013a\toolbox\matlab\audiovideo\handel.mat
>> load handel
>> soundsc(y) % play the short audio clip
Run Code Online (Sandbox Code Playgroud)

我想在Python中使用这些数据,所以我使用scipy.io.loadmat[1].具体来说,我想缩放音频的值以跨越16位有符号整数的整个范围,即,音频信号的最小值被映射到-2 ^ 15,最大的值被映射到2 ^ 15-1.在Matlab中执行此操作时,我感到惊讶的是给出了与Python不同的结果:

Matlab的:

>> load handel
>> int16(round(interp1([min(y), max(y)], [-2^15, 2^15-1], y(1:10))))
ans =
     -1              %%% <-- Different from Python
   -253
  -3074
  -1277
    252
   1560
    772
  -1025
  -1277
  -3074
Run Code Online (Sandbox Code Playgroud)

蟒蛇:

In …
Run Code Online (Sandbox Code Playgroud)

python matlab numerical numpy rounding

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

我需要非常快地计算斯特林近似

我正在编写一个用于统计采样的小型库,它需要尽可能快地运行。在分析中,我发现函数中大约 40% 的时间花在计算阶乘对数的斯特林近似值上。我正在将优化工作集中在这一部分上。这是我的代码(使用MPFR):

const double AL[8] =
{ 0.0, 0.0, 0.6931471806, 1.791759469, 3.178053830, 4.787491743,
    6.579251212, 8.525161361 };
void HGD::mpfr_afc(mpfr_t &ret, const mpfr_t &val){

    if(mpfr_cmp_ui(val, 7) <= 0){
        mpfr_set_d(ret, AL[mpfr_get_ui(val, MPFR_RNDN)], MPFR_RNDN);
    }else{
        mpfr_set(ret, val, MPFR_RNDN);
        mpfr_add_d(ret, ret, 0.5, MPFR_RNDN);
        mpfr_log(LV, val, MPFR_RNDN);
        mpfr_mul(ret, LV, ret, MPFR_RNDN);
        mpfr_sub(ret, ret, val, MPFR_RNDN);
        mpfr_add_d(ret, ret, 0.399089934, MPFR_RNDN);
    }
}
Run Code Online (Sandbox Code Playgroud)

我有几个不同的想法:

  • 预先计算函数前 8 个以上的输入。
  • 优化数学(使用较粗略的近似值以获得较小的精度)
  • 使用多个线程并行计算不同的输入
  • 当数字适合机器数据类型时切换到本机算术

我还可以采取其他方法吗?

c c++ numerical mpfr arbitrary-precision

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

Logsoftmax 稳定性

我知道如何通过添加到元素 -max _i x_i 来使 softmax 稳定。这避免了上溢和下溢。现在,记录此日志可能会导致下溢。log softmax(x) 可以计算为零,导致 -infinity。

我不知道如何解决它。我知道这是一个常见问题。我读了几个答案,我不明白。但是我仍然对如何解决这个问题感到困惑。

PS:如果你提供一个简单的例子,那就太棒了。

numerical underflow numerical-stability softmax

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

Perl中最小的非零,正浮点数是多少?

我在Perl中有一个程序可以处理偶尔会非常小的概率.由于舍入误差,有时其中一个概率为零.我想检查以下内容:

use constant TINY_FLOAT => 1e-200;
my $prob = calculate_prob();
if ( $prob == 0 ) {
    $prob = TINY_FLOAT;
}
Run Code Online (Sandbox Code Playgroud)

这工作正常,但我实际上看到Perl生成的数字小于1e-200(我刚看到8.14e-314飞过).对于我的应用程序,我可以更改calculate_prob(),以便它返回TINY_FLOAT的最大值和实际概率,但这让我对如何在Perl中处理浮点数感到好奇.

Perl中最小的正浮点值是多少?它是平台依赖的吗?如果有,是否有一个快速程序,我可以用来在我的机器上找出它?

floating-point perl numerical

4
推荐指数
3
解决办法
3450
查看次数

数字键盘?

我的应用程序中有几个实例,我更喜欢使用数字键盘.WP7中是否存在一个,如果存在,我将如何将该文件弹出一个文本框而不是正常文本框?

keyboard numerical windows-phone-7

4
推荐指数
1
解决办法
2750
查看次数

C++中的数值积分

我需要集成一个函数(两个变量).我知道我可以通过使用Fubini定理来集成一个变量函数,然后使用数值方法,如Rectangle方法梯形规则.

但是在C++中有没有预先构建的函数呢?我需要整合单位R2三角形((0,0), (1,0), (0,1)).

c++ integration numerical

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