您的位置:首页 > 运维架构

IDL出现% Program caused arithmetic error: Floating illegal operand 错误!!

2016-07-28 23:51 330 查看
用IDL处理NaN数据时,用到where函数时,经常会出现Program caused arithmetic error: Floating illegal operand 错误,查了下发现官网有说明,记录下防下次出错!!

Special Floating-Point Values

Machines which implement the IEEE standard for binary floating-point arithmetic have two special values for undefined results: NaN (Not A Number) and Infinity. Infinity results when a result is larger than the largest representation. NaN is the result of an undefined computation such as zero divided by zero, taking the square-root of a negative number, or the logarithm of a non-positive number. In many cases, when IDL encounters the value NaN in a data set, it treats it as “missing data.” The special values NaN and Infinity are also accessible in the read-only system variable !VALUES. These special operands propagate throughout the evaluation process—the result of any term involving these operands is one of these two special values.

Note: For the minimum (<) and maximum (>) operators with NaN operands, the result is undefined and may not necessarily be the special value NaN.

For example:

; Multiply NaN by 3

PRINT, 3 * !VALUES.F_NAN

IDL prints:

NaN

It is important to remember that the value NaN is literally not a number, and as such cannot be compared with a number. For example, suppose you have an array that contains the value NaN:

A = [1.0, 2.0, !VALUES.F_NAN, 3.0]

PRINT, A

IDL prints:

1.00000 2.00000 NaN 3.0000

If you try to select elements of this array by comparing them with a number (using the WHERE function, for example), IDL might generate an error (depending on the hardware and operating system):

; Print the indices of A that are not equal to 1

PRINT, WHERE( A NE 1.0 )

IDL prints:

1 2 3

% Program caused arithmetic error: Floating illegal operand

(Depending on your hardware and operating system, you may not see the floating-point error.)

To avoid this problem, use the FINITE function to make sure arguments to be compared are in fact valid floating-point numbers:

PRINT, WHERE( FINITE(A) )

IDL prints the indices of the finite elements of A:

0 1 3

To then print the indices of the elements of A that are both finite and not equal to 1.0, you could use the command:

good = WHERE( FINITE(A) )

PRINT, good[WHERE(A[good] NE 1.0)]

IDL prints:

1 3

Similarly, if you wanted to find out which elements of an array were not valid floating-point numbers, you could use a command like:

; Print the indices of the elements of A that are not valid

; floating-point numbers.

PRINT, WHERE( ~FINITE(A) )

IDL prints:

2

Note that the special value Infinity can be compared to a floating point number. Thus, if:

B = [1.0, 2.0, !VALUES.F_INFINITY]

PRINT, B

IDL prints:

1.00000 2.00000 Inf

and

PRINT, WHERE(B GT 1.0)

IDL prints:

1 2

You can also compare numbers directly with the special value Infinity:

PRINT, WHERE(B EQ !VALUES.F_INFINITY)

IDL prints:

2

Note: On Windows, using relational operators such as EQ and NE with the values infinity or NaN (Not a Number) causes an “illegal operand” error. The FINITE function’s INFINITY and NAN keywords can be used to perform comparisons involving infinity and NaN values. For more information, see FINITE.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  idl