Syntax: var<1d-4

6 ビュー (過去 30 日間)
Pranav Krishnan
Pranav Krishnan 2020 年 5 月 29 日
編集済み: dpb 2020 年 5 月 30 日
In the body of a program I'm using as reference, this if statement is provided:
dp=max(max(abs(phi1a-phi1)));
if(~(dp>0) & ~(dp<0) ) disp('NaN'); return; end
if(dp<1d-4) break; end % THIS LINE
where variable 'dp' is defined as so, and phi1a and ph1 are NxN matrices. What I don't understand is the second if condition - does this mean 10^-4? If so why is 'd' used, instead of 'e' as is usually.

採用された回答

dpb
dpb 2020 年 5 月 29 日
編集済み: dpb 2020 年 5 月 30 日
dp=max(max(abs(phi1a-phi1)));
if(~(dp>0) & ~(dp<0) ) disp('NaN'); return; end
if(dp<1d-4) break; end % THIS LINE
could be written as
dp=max(abs(phi1a(:)-phi1(:))); % pre-R2018b
dp=max(abs(phi1a-phi1),[],'all'); % R2018b and later
if isnan(dp), disp('NaN'); return; end
if(dp<1E-4), break; end
'd' for the exponent letter is MATLAB carryover from Fortran syntax; "e" is single precision, "d" is double. MATLAB uses default double precision for all numeric values unless specifically cast to something else and "e" is interpreted the same as "d". Upper/lower case are also allowable and mean the same; I think written as a literal constant the uppercase is more legible but it's personal taste.
In Fortran, however, the two forms are different -- 1.0E-4 is a single precision value; 1.0D-4 is double precision. For values which can be represented identically as the above, the end result on assignment is the same; numbers which are not, however, like 0.2, are in fact different if stored in a double precision variable. The D form will have full precision; the E form will be a single precision result zero-extended to double; it will still have the single precision precision stored in the double variable.
However, unlike Fortran, MATLAB and C i/o does not support the "dD" form for double precision constants other than as literal constants in source code as written above.
>> sscanf('1E-4','%f')
ans =
1.0000e-04
>> sscanf('1D-4','%f')
ans =
1
>> sscanf('1D-4','%e')
ans =
1
>> sscanf('1e-4','%e')
ans =
1.0000e-04
>>
NB: the constant written with D fails with either floating point format string.
The writer of the above code would appear to have had a FORTRAN background and to not be terribly familiar with MATLAB syntax.
ADDENDUM: Or perhaps the code was translated from old FORTRAN, maybe, and just implemented verbatim on a line-by-line basis.

その他の回答 (0 件)

カテゴリ

Help Center および File ExchangeFortran with MATLAB についてさらに検索

製品


リリース

R2020a

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by