HYF*_*HYF 7 floating-point matlab rounding
我想更改MATLAB中浮点运算的舍入模式。根据IEEE 754-2008,有五种舍入策略:
MATLAB是否支持这5种策略?如何在MATLAB中更改浮点运算的舍入模式?
的种类。有一个未公开的feature('setround')
函数调用,您可以使用它来获取或设置 Matlab 使用的舍入模式。
所以,它可以做到,但你不应该这样做。:)
警告:这是一个未记录的、不受支持的功能!使用后果自负!
这feature('setround')
支持 5 种 IEEE-754 舍入模式中的 4 种:只有一种“最近”模式,我不知道它是“与偶数相关”还是“与零相关”。
支持的模式:
feature('setround')
– 获取当前舍入模式feature('setround', 0.5)
– 向最近的舍入(不知道它是否与偶数或远离零有关)feature('setround', Inf)
– 向上取整(朝向 +Inf)feature('setround', 0)
– 向零舍入feature('setround', -Inf)
– 向下舍入(朝向 -Inf)测试注意事项:IEEE-754 舍入模式不影响round()
及其相关性。相反,它控制着算术运算在浮点精度限制下的行为方式。
%ROUNDINGEXAMPLE Demonstrates IEEE-754 Rounding Mode control
%
% This uses a completely undocumented and unsupported feature!
% Not for production use!
%% Setup
clear; clc
n = 2000;
X = ones(n)*1E-30; % matrix with n^2 elements
defaultRoundingMode = feature('setround'); % store default rounding mode
%%
feature('setround',0.5);
r1 = prettyPrint('Nearest', sum(X(:)));
%{
sign exponent mantissa
0 01110110001 0011010101111100001010011001101001110101010000011110
| \_________/ \__________________________________________________/
| | ______________________|___________________________
| | / \
(-1)^0 2^( 945 - 1023) 1.0011010101111100001010011001101001110101010000011110 = 4e-24
%}
%%
feature('setround',-Inf);
r2 = prettyPrint('To -Infinity', sum(X(:)));
%{
sign exponent mantissa
0 01110110001 0011010101111100001010011001101001011100000111000110
| \_________/ \__________________________________________________/
| | ______________________|___________________________
| | / \
(-1)^0 2^( 945 - 1023) 1.0011010101111100001010011001101001011100000111000110 = 4e-24
%}
%%
feature('setround',Inf);
r3 = prettyPrint('To Infinity', sum(X(:)));
%{
sign exponent mantissa
0 01110110001 0011010101111100001010011001101010100011101100100001
| \_________/ \__________________________________________________/
| | ______________________|___________________________
| | / \
(-1)^0 2^( 945 - 1023) 1.0011010101111100001010011001101010100011101100100001 = 4e-24
%}
%%
feature('setround',0);
r4 = prettyPrint('To zero', sum(X(:)));
%{
sign exponent mantissa
0 01110110001 0011010101111100001010011001101001011100000111000110
| \_________/ \__________________________________________________/
| | ______________________|___________________________
| | / \
(-1)^0 2^( 945 - 1023) 1.0011010101111100001010011001101001011100000111000110 = 4e-24
%}
%%
feature('setround',defaultRoundingMode);
r5 = prettyPrint('No accumulated roundoff error', 4e-24);
%{
sign exponent mantissa
0 01110110001 0011010101111100001010011001101010001000111010100111
| \_________/ \__________________________________________________/
| | ______________________|___________________________
| | / \
(-1)^0 2^( 945 - 1023) 1.0011010101111100001010011001101010001000111010100111 = 4e-24
%}
%% Helper function
function r = prettyPrint(s, r)
fprintf('%s:\n%65.60f\n\n', s, r);
end
Run Code Online (Sandbox Code Playgroud)
我得到:
Nearest:
0.000000000000000000000003999999999966490758963870373537264729
To -Infinity:
0.000000000000000000000003999999999789077070014108839608005726
To Infinity:
0.000000000000000000000004000000000118618095059505975310731249
To zero:
0.000000000000000000000003999999999789077070014108839608005726
No accumulated roundoff error:
0.000000000000000000000003999999999999999694801998206811298525
Run Code Online (Sandbox Code Playgroud)
感谢 MathWorks 技术支持的 Ryan Klots 让我直截了当并提供了很好的演示代码!