programing

VBA에서 무한대와 그 이상으로.

starjava 2023. 6. 11. 10:14
반응형

VBA에서 무한대와 그 이상으로.

이 게시물은 .NET NaN의 & Inifinite 값이 Excel 2010 VBA로 다시 전달되는 것에 관한 것입니다.

.NET NaN 또는 Neg, Pos Infinity를 반환할 수 있는 C# 메서드를 사용합니다.VBA의 결과는 이상하고(즉, 평소보다 이상함), 안전하게 상황에 대처하기 위해 생각해낸 유일한 방법은 "-1.#"이라는 점입니다.IND" 또는 "-1.#"INF" 또는 "1".#INF".

더 좋은 방법이 있습니까?

궁금하시면 이상한 부분을 여기에 기록해 두었습니다.(예는 NaN에 대한 것이지만, pos 또는 neg infinity에 대한 이야기는 동일합니다.)

double  dVal  =  CSharpMethodReturningDouble()  ' via .NET assembly / COM interop
variant vVal  =  CSharpMethodReturningDouble()  ' via .NET assembly / COM interop

C# 메소드가 더블을 반환하는 경우.NaN, 그러면 (임마인드 윈도우에서):

?dVal               
 -1.#IND            
?vVal                
 -1.#IND             

NaN 테스트가 양수인 (박스형) 변형(유형 = 이중)

?IsNumeric(vVal) 
 True
?TypeName(vVal)
 Double

(박스형) 변형 NaN에 대한 비교는 작동하지만 예상과 반대의 결과를 가져옵니다.(박스에서 해제된) 더블을 비교하면 오버플로 예외가 발생합니다.

?vVal=1          '<== NaN comparisons should always return false
 True               
?vVal=0          '<== that's not what you get with -1.#IND
 True               
?dVal=0          '<== strangely, the same comparison on the unboxed double fails
 (OverFlow Exc)

(박스형) 변형 모델에 대한 작업은 오버플로 예외를 발생시킵니다. (박스형) 변형 모델에 대한 작업은 작업을 두 배로 증가시킵니다(그리고 반환 -1.#).IND, 예상대로)

?vVal * 1.1      '<== even stranger, for arith ops its the boxed value that fails
 (Overflow Exc)
?dVal * 1.1      '<== but the operation on the unboxed double goes through
-1.#IND 

IsError, IsNumeric은 도움이 되지 않습니다:

?IsError(vVal)
 False            
?IsError(dVal)
 False            
?IsNumeric(vVal)
 True       
?IsNumeric(dVal)
 True            

항상 문자열 비교를 사용하여 다음을 테스트할 수 있습니다.

?vVal = "-1.#IND"
True
?dVal = "-1.#IND"
True

더블 이후로.NAN 필드는 숫자가 아닌 값을 나타냅니다. 문자열 비교를 사용하여 올바른 트랙에 있을 가능성이 높습니다.

반대 방향으로 가고 있는 경우(즉, VB 밖으로 값을 전달하는 경우) ByRef 및 ByVal이 일반적인 용의자입니다.

VB의 IsNumeric() 기능이 항상 직관적인 것은 아닙니다.예를 들어, 영숫자 코드가 우연히 과학적 표기법의 숫자가 될 경우 True를 반환합니다.

당신의 현재 해결 방법이 허용된다는 David의 의견에 동의합니다.외국어 설치에서 테스트를 수행해야 합니다!

다음 예제에서는 솔루션의 일부가 될 수 있습니다. 1과 0이 동시에 동일한 값은 정규 숫자가 아닙니다.이 검정은 NaNs와 정규 숫자를 구별할 수 있습니다.이와 유사한 규칙을 찾아 +/- 무한대를 찾을 수 있습니다.

현재 로케일을 고려해야 합니다.NaN이 될 수 있습니다."-1.#IND"또는"-1,#IND"십진수 구분 기호 설정에 따라 달라집니다.

이를 방지하는 한 가지 방법은 InStr 비교입니다.

InStr(CStr(dVal), "#IND") <> 0

언급URL : https://stackoverflow.com/questions/9204323/to-infinity-and-beyond-in-vba

반응형