请考虑以下代码:
0.1 + 0.2 == 0.3 -> false
Run Code Online (Sandbox Code Playgroud)
0.1 + 0.2 -> 0.30000000000000004
Run Code Online (Sandbox Code Playgroud)
为什么会出现这些不准确之处?
我有两个大数组,大约1000行和1000列.我需要比较这些数组的每个元素,如果相应的元素相等,则将1存储在另一个数组中.
我可以使用for循环但这需要很长时间.我怎么能更快地做到这一点?
我想知道什么是更好的风格/更高效:
x = linspace(-1, 1, 100);
Run Code Online (Sandbox Code Playgroud)
要么
x = -1:0.01:1;
Run Code Online (Sandbox Code Playgroud) 显然浮动比较总是很棘手.我在我的(科学)代码中有很多断言检查,所以我经常要检查总和是否相等,以及类似的问题.
是否有快速简便/最佳实践方式来执行这些检查?
我能想到的最简单的方法是为固定容差浮点数比较建立一个自定义函数,但这对我来说似乎很难看.我更喜欢内置的解决方案,或者至少是非常清晰和易于理解的东西.
感谢您的输入!
我想知道是否有办法克服精确度问题,这似乎是我的机器内部表示浮点数的结果:
为清楚起见,问题归纳为:
// str is "4.600"; atof( str ) is 4.5999999999999996
double mw = atof( str )
// The variables used in the columns calculation below are:
//
// mw = 4.5999999999999996
// p = 0.2
// g = 0.2
// h = 1 (integer)
int columns = (int) ( ( mw - ( h * 11 * p ) ) / ( ( h * 11 * p ) + g ) ) + 1;
Run Code Online (Sandbox Code Playgroud)
在转换为整数类型之前,列计算的结果是1.9999999999999996; 距离2.0的理想结果还差不多.
任何建议最受欢迎.
我的Matlab版本是R2012a
为什么Matlab 1.1-0.2不等于0.9 !!!!!?
这太可怕了!
>> 1.1-0.2 == 0.9
ans =
Run Code Online (Sandbox Code Playgroud)0
我理解为什么sin(pi)不等于零的原因是因为没有足够的位来存储"pi"的所有有效数字,但这与机器epsilon有什么关系?
我在网上读到了什么机器epsilon,但经过一个小时的阅读,各种不同的定义措辞不同,我感到困惑,并不理解epsilon的概念.我最终对自己的愚蠢感到非常沮丧......
以下示例在MATLAB文档中给出,我不明白,有人可以向我解释该示例试图显示的内容吗?
找到从10.0到下一个最大双精度数的距离.
Run Code Online (Sandbox Code Playgroud)d = eps(10.0) d = 1.7764e-15
我假设meanfucntion采用矩阵并通过对数组的所有元素求和来计算其均值,并将其除以元素的总数.
但是,我正在使用此功能来计算矩阵的平均值.然后我遇到了一个我不希望平均函数考虑我的矩阵的0个元素的点.具体来说,我的矩阵是1x100000数组,并且它的元素的1/3到1/2都是0.如果是这种情况,我可以替换0元素,NULL以便matlab在计算时不会考虑它们意思?我还可以做些什么?
在Octave中,我编写了一个Sigmoid函数的代码,该函数返回0到1之间的值; 在一个理想的世界中,它只会为-Inf返回0而对于+ Inf只返回1,但由于浮点不精确,非常接近这些值的值都是四舍五入的.
我的问题是为什么会发生以下情况:对于0和1,舍入的边界明显不同:
>> sigmoid(-709)
ans = 1.2168e-308
>> sigmoid(-710)
ans = 0
>> sigmoid(36)
ans = 1.00000
>> sigmoid(37)
ans = 1
>> (sigmoid(37)-1)==0
ans = 1
>> (sigmoid(36)-1)==0
ans = 0
>> sigmoid(-710)==0
ans = 1
>> sigmoid(-709)==0
ans = 0
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我们可以看到将输出舍入到1所需的值在数量上要小于舍入到0所需的值.37与-710相比是一个非常大的差异,因为它们的大小应该相同但是相反的迹象......
也许这是我的功能问题:
function [z] = sigmoid(x)
z = 1.0 ./(1.0+exp(-x));
endfunction
Run Code Online (Sandbox Code Playgroud)
另一点是,我改变了函数,将结果加1(基本上将图形翻译为1),边界分别变为+/- 37,分别为2和1 - 这让我觉得它真的与0有关特别是,而不仅仅是功能及其下限.
如果它与我的电脑有关,那会是什么导致这样的事情?
有人知道为什么double()在Matlab(R2016a)中使用单精度浮点数进行投射会改变最后的数字吗?这是一个例子:
format 'long'
x=3.2530601; %arbitrary single precision number
x_s=single(x);
x_d=double(x_s);
Run Code Online (Sandbox Code Playgroud)
如果我查看变量的类和值,我可以看到以下内容:
x并且x_d是双倍的,x_s是预期的单个.价值观是:
x=3.253060100000000
x_s=3.2530601
x_d=3.253060102462769
Run Code Online (Sandbox Code Playgroud)
由于数字3.2530601可以表示为双精度浮点数或单精度浮点数,因此我不明白为什么x和x_d不一样.他们远比x+eps(x).我想也许Matlab试图x_d通过有理分数近似来计算出双精度,但是调用rat(x,16)并没有给出相同的结果x_d.我很无能为力.有谁知道这里发生了什么?