2016-12-14 5 views
1

에 관한 IBM 메인 프레임의 APL2의 흥미로운 버그이 환경에서 우리는 소비 된 서비스 단위의 수효를 측정합니다.

0 100 100 100 100 100 1000⊥⎕TS  ⍝ this statement consumes around 150 SUs 
0 100 100 100 100 100 1000.0⊥⎕TS  ⍝ this statement consumes around 5 SUs 

여기 무슨 일이야 : 나는 버그를 설명하기 위해 밀리 초 현재 dateTime으로 변환거야? 음, 왼쪽 인자의 임의의 항목에 .0을 붙이면 통역사에게 플로트 모드로 들어가게됩니다. 이를 사용하지 않으면 먼저 정수로 작업을 처리하고 작동하지 않는 것을 확인한 다음 부동 모드로 다시 시도합니다.

같은 트릭을 오른쪽 인수에 사용하거나 0.0을 추가하거나 을 곱하여 사용할 수 있습니다.

+0

https://stackoverflow.blog/2011/07/its-ok-to-ask-and-answer-your-own-questions/ – mappo

+0

저는 컴파일러가 특별히 최적화되지 않았다고 생각합니다. 교활한 돈 벌기 트릭을 IBM에서 ...-) –

+0

@mappo QA 형식에 맞는 대답 부분 ("글쎄, 붙임으로써 .0 ...")을 답으로 생각해야합니다. –

답변

1

는 호기심 중 나는 Dyalog APL V15에서 같은 시도 :

 ]runtime '0 100 100 100 100 100 1000.0⊥⎕TS' '0 100 100 100 100 100 1000⊥⎕TS' -compare -repeat=500000 

    0 100 100 100 100 100 1000.0⊥⎕TS → 4.6E¯7 | 0% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕ 
    0 100 100 100 100 100 1000⊥⎕TS → 4.3E¯7 | -7% ⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕⎕  
이 거의 차이 ...

PS :는 자신의 질문에 대답함으로써 지식을 공유 할 확실히 괜찮 - 그러나 그렇게하기 위해서는 질문의 일부가 아닌 "대답"으로 답변을 게시해야합니다. 그렇게하면 자신의 대답을 받아 들일 수 있습니다 (하루 정도 기다린 후) 그러면 질문이 닫힙니다. 나는 다음과 같은 상상

+0

Windows 용 IBM APL2에서 동일한 벤치마킹을했는데 차이점이 없습니다. PS에 감사드립니다. 관리자 만 도움이 되었다면 ... – mappo

0

일어나고있다 : (한 사람의 추측)

0 100 100 100 100 100 1000 아마 32 APL2

에서,

Dyalog에서 16 비트 정수 벡터이다 ⊥ 일반적으로 넓은을 반환 좌우 인수 형의

⎕TS는 정수 벡터

대답 약, 2.017011212181701E16 16 또는 32 비트 정수이다. 20170112122036000은 분명히 64 비트 (또는 그 이상)의 부동 소수점 숫자입니다.

APL2는이 디코딩 연산이 정수 연산을 사용하여 성공할 것이라고 확신합니다. 먼저 정수 연산을 사용하여 디코드를 시도하지만 연산 오버플로로 인해 연산이 실패합니다. 그런 다음 APL2는 부동 소수점을 사용하여 다시 시도합니다. 타이밍이 증가하면 오버플로를 정리하고 정리하고 다시 수행합니다.

왼쪽 인수를 0 100 100 100 100 100 1000으로 변경하면 정수 연산을 처음 시도하지 않고도 64 비트 부동 소수점 연산을 사용하게됩니다.

다이알 로그는 이것에 신경 쓰지 않고 부동 소수점으로 디코딩합니다.

흥미롭게 Dyalog, ⎕DR 0 100 100 100 100 100 1,000 ⊥ 1 64 비트 부동 소수점

645이다 +/+ 및 \ 등 오버플 유사한 문제가있다. ⎕DR +/100,000,000분의 21

323, 32 비트 정수

⎕DR +/100,000,000분의 22 645 GNU APL을 이용하여이 예를 시도 유익한 것이다

64 비트 부동 인 64 비트 정수를 사용합니다.