我正在计算给定横坐标 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 的差值总是很大。
假设我有两个浮点数x和y,它们的值非常接近。
计算机上可以表示离散数量的浮点数,因此我们可以按升序枚举它们:f_1, f_2, f_3, ...。x我希望找到和在此列表中的距离y(即它们是 1、2、3、... 还是n离散步长?)
是否可以仅使用算术运算(+-*/)而不查看二进制表示来做到这一点?我主要感兴趣的是它在 x86 上的工作原理。
假设 和y > x之间x只有y几步(例如 < 100),下面的近似值是否正确?(可能不会 ...)
(y-x) / x / eps
这里eps表示机器 epsilon。(机器 epsilon 是 1.0 和下一个最小浮点数之间的差。)
我正在寻找类似于英特尔的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]);
}
如:
double a[ARRAY_SIZE], b[ARRAY_SIZE];
vectorized_ln(a, b, ARRAY_SIZE);
并使用Intel和AMD架构上提供的SIMD指令的全部功能.开发环境包含在Linux上运行的GNU工具.英特尔的数学核心库包含一个名为矢量数学库的东西,它宣传"计算密集型核心数学函数的矢量实现",包括基本函数,触发函数等,所以我正在寻找类似的东西,但是免费的.
我们知道机器epsilon,ε是"在给定浮点类型中可表示的1和最小值之间的差值".1
但是,该定义没有说明下一个较小的值.1和下一个较小的值有什么区别?
注意
1 ISO/IEC C 2011标准,第5.2.4.2.2节,第13段(对浮点没有权威性,但是机器epsilon的常见描述的一个例子).
我可以让Numpy同意Matlab和Python round吗?
Matlab 2013a:
>> round(-0.5)
ans =
    -1
Python(使用Numpy数组,或只是一个标量,相同的结果):
>>> import numpy
>>> round(numpy.array(-0.5))
-1.0
Numpy,奇怪的是:
>>> import numpy
>>> numpy.round(numpy.array(-0.5))
-0
圆形平台的这种差异是否依赖?
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
我想在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
蟒蛇:
In …我正在编写一个用于统计采样的小型库,它需要尽可能快地运行。在分析中,我发现函数中大约 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);
    }
}
我有几个不同的想法:
我还可以采取其他方法吗?
我知道如何通过添加到元素 -max _i x_i 来使 softmax 稳定。这避免了上溢和下溢。现在,记录此日志可能会导致下溢。log softmax(x) 可以计算为零,导致 -infinity。
我不知道如何解决它。我知道这是一个常见问题。我读了几个答案,我不明白。但是我仍然对如何解决这个问题感到困惑。
PS:如果你提供一个简单的例子,那就太棒了。
我在Perl中有一个程序可以处理偶尔会非常小的概率.由于舍入误差,有时其中一个概率为零.我想检查以下内容:
use constant TINY_FLOAT => 1e-200;
my $prob = calculate_prob();
if ( $prob == 0 ) {
    $prob = TINY_FLOAT;
}
这工作正常,但我实际上看到Perl生成的数字小于1e-200(我刚看到8.14e-314飞过).对于我的应用程序,我可以更改calculate_prob(),以便它返回TINY_FLOAT的最大值和实际概率,但这让我对如何在Perl中处理浮点数感到好奇.
Perl中最小的正浮点值是多少?它是平台依赖的吗?如果有,是否有一个快速程序,我可以用来在我的机器上找出它?
我的应用程序中有几个实例,我更喜欢使用数字键盘.WP7中是否存在一个,如果存在,我将如何将该文件弹出一个文本框而不是正常文本框?
我需要集成一个函数(两个变量).我知道我可以通过使用Fubini定理来集成一个变量函数,然后使用数值方法,如Rectangle方法或梯形规则.
但是在C++中有没有预先构建的函数呢?我需要整合单位R2三角形((0,0), (1,0), (0,1)).