首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何阻止MATLAB将极小的值舍入为0?

如何阻止MATLAB将极小的值舍入为0?
EN

Stack Overflow用户
提问于 2014-02-22 01:02:20
回答 1查看 4.8K关注 0票数 1

我在MATLAB中有一个代码,它可以处理非常小的数字,例如,我有大约10^{-25}的值,但是当MATLAB进行计算时,值本身四舍五入为0。请注意,我指的不是使用format来显示这些额外的小数,而是将数字本身更改为0。我认为这是因为MATLAB在默认情况下使用小数点后15位进行计算。我如何改变这一点,以使非常非常小的数字在计算中保持不变?

编辑:

我的代码如下:

代码语言:javascript
复制
clc;
clear;

format long;

% Import data
P = xlsread('Data.xlsx', 'P');
d = xlsread('Data.xlsx', 'd');
CM = xlsread('Data.xlsx', 'Cov');


Original_PD = P;                       %Store original PD
LM_rows = size(P,1)+1;                           %Expected LM rows
LM_columns = size(P,2);                 %Expected LM columns
LM_FINAL = zeros(LM_rows,LM_columns);    %Dimensions of LM_FINAL

for ii = 1:size(P,2)

P = Original_PD(:,ii);
% c1, c2, ..., cn, c0, f
interval = cell(size(P,1)+2,1);

for i = 1:size(P,1)
    interval{i,1} = NaN(size(P,1),2);
    interval{i,1}(:,1) = -Inf;
    interval{i,1}(:,2) = d;

    interval{i,1}(i,1) = d(i,1);
    interval{i,1}(i,2) = Inf;
end
interval{i+1,1} = [-Inf*ones(size(P,1),1) d];
interval{i+2,1} = [d Inf*ones(size(P,1),1)];

c = NaN(size(interval,1),1);
for i = 1:size(c,1)
    c(i,1) = mvncdf(interval{i,1}(:,1),interval{i,1}(:,2),0,CM);
end

c0 = c(size(P,1)+1,1);
f = c(size(P,1)+2,1);
c = c(1:size(P,1),:);
b0 = exp(1);
b = exp(1)*P;

syms x;

eqn = f*x;
for i = 1:size(P,1)
    eqn = eqn*(c0/c(i,1)*x + (b(i,1)-b0)/c(i,1));
end

eqn = c0*x^(size(P,1)+1) + eqn - b0*x^size(P,1);

x0 = solve(eqn);
x0 = double(x0);

for i = 1:size(x0)
    id(i,1) = isreal(x0(i,1));
end

x0 = x0(id,:);
x0 = x0(x0 > 0,:);

clear x;

for i = 1:size(P,1)
    x(i,:) = (b(i,1) - b0)./(c(i,1)*x0) + c0/c(i,1);
end

% x = [x0 x1 ... xn]
x = [x0'; x];
x = x(:,sum(x <= 0,1) == 0);

% lamda
lamda = -log(x);
LM_FINAL(:,ii) = lamda;
end

问题出在这一步:

代码语言:javascript
复制
 for i = 1:size(P,1)
        x(i,:) = (b(i,1) - b0)./(c(i,1)*x0) + c0/c(i,1);
end

其中“差”非常接近于0。我如何才能在这一步停止这种舍入?

例如,当i= 10时,我有以下值:

代码语言:javascript
复制
b_10 = 0.006639735483297
b_0 = 2.71828182845904
c_10 = 0.000190641848119641
c_0 = 0.356210110252579
x_0 = 7.61247930625269

经过计算,我们得到:-1868.47805854794 + 1868.47805854794,其差值为-2.27373675443232E-12,由MATLAB四舍五入为0。

编辑2:

Here是我的数据文件,用于代码。运行代码后(大约需要一分钟半的时间才能完成运行),变量x中的行11显示为0(甚至在双击检查其实际值之后也是如此),而实际上它不应该显示。

EN

回答 1

Stack Overflow用户

发布于 2014-02-22 01:09:17

您遇到的问题是因为IEEE standard for floating points不能区分您的数字和零,因为它们没有利用足够的位。

看看John D‘’Errico的Big Decimal ClassVariable Precision Integer Arithmetic。另一种选择是使用Big Integer Class from Java,但如果您不熟悉Java and othe rexternal libraries in MATLAB的使用,这可能会更具挑战性。

你能举一个使用1e-25并得到零的计算的例子吗?下面是我对一个名为small_num的浮点数和一个叫做small_hpf的高精度浮点数进行赋值并乘以pi得到的结果。

代码语言:javascript
复制
>> small_num = 1e-25

small_num =

   1.0000e-25

>> small_hpf = hpf(1e-25)
small_hpf =
1.000000000000000038494869749191839081371989361591338301396127644e-25
>> small_num * pi

ans =

   3.1416e-25

>> small_hpf * pi
ans =
3.141592653589793236933163473501228686498684350685747717239459106e-25
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21940574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档