3

8-byte doubles can represent all 4-byte ints precisely이 주어지면 double을 저장하는 double A가 정수를 저장하는 B (정수 B는 A를 나눕니다)로 나눌 지 궁금합니다. 항상 자신의 몫 인 정수에 해당하는 정확한 double을 주시겠습니까? 그래서, 다음은정수를 나타내는 double의 정확한 나눗셈

int B,C = whatever s.t. B*C does not overflow 32-bit int 
double(B*C)/double(C) == double((B*C)/C) ? 

는 IEEE754 표준 보증이 작업을 수행 보장하고, B 및 C 정수이고, B의 * C는 32 비트 INT 내에서 맞는 경우?

필자가 테스트 한 결과, 필자가 시도한 모든 예제에서 효과가있는 것으로 보입니다. 파이썬에서 :

>>> (321312321.0*3434343.0)/321312321.0 == 3434343.0 
True 

묻는 이유는 matlab에은 (는) 자기의 int로 작업 할 수 있습니다, 그래서 종종 단지 정수 계산을위한 기본 복식을 사용하는 것입니다. 그리고 정수가 정확히 나눌 수 있다는 것을 알았을 때, 그리고 현재의 질문에 대한 대답이 '예'라는 것을 알게되면 int에 대한 캐스트, 즉 덜 읽을 수있는 idivide(..) 등을 피할 수 있습니다.

+1

http://stackoverflow.com/q/3793838/2586922 –

답변

1

Luis Mendo의 의견은이 질문에 대한 답변이지만, Matlab의 사용에 특히 유용한 유틸리티 인 described here이 있습니다. eps(numberOfInterest)을 사용하여 다음으로 큰 배정 밀도 부동 소수점 숫자까지의 거리를 찾을 수 있습니다. 예를 들어 :

eps(1) = 2^(-52) 
eps(2^52) = 1 

이 실질적으로 이중에서 개최 정수와 수학 연산들이 32 비트에서 개최되는 것보다 꽤 큰 2^(52), 오버 플로우하지 않는 한 정확한되는 것이 보증 int 유형.

+0

그래서 실제 결과에 가장 가까운 ** ** ** 배수로 보장되는 복식에 대한 연산 결과가 있습니까? 저는 Java의 StrictMath가 http://docs.oracle.com/javase/7/docs/api/java/lang/StrictMath.html에 대한 것이 었습니다. 보통 (신속하고 정확한 작업 사이의 절충) 작업은 마지막 2 진수 또는 2의 작은 오류가 발생합니다. –

+0

Java 또는 StrictMath에 익숙하지 않지만 "strict"는 "[StrictMath의 알고리즘]이 ... 게시 된 알고리즘과 동일한 결과를 생성한다는 것을 말하는 것으로 설명서를 읽습니다. .. 패키지 ... fdlibm ". 즉, StrictMath 메소드를 사용하면 fdlibm의 메소드를 사용할 때와 동일한 결과를 얻을 수 있습니다. 수학 함수에 사용되는 알고리즘이 빠르고 정확하지 않거나 속도가 느리며 정밀도가 높은 경우가 분명합니다. 그러나 실수하지 않는 한 분단에는 하나의 알고리즘 만 있으므로 우려는 여기에 적용되지 않습니다. –

+0

Mathworks의 가치는 Matlab의 각 함수에서 사용하는 알고리즘에 대해 일반적으로 투명합니다 (문서 참조). 따라서 특정 수학 함수에 관심이 있다면 더 자세히 살펴볼 수 있어야합니다. –