2014-03-06 11 views
4

두 변수 ab이 있거나 float 유형 또는 모두 값이 들어있는 유형이 double 인 두 가지 변수가 있다고 가정합니다. 다음 주장은 항상 성립합니까? 내 말은, 수치적인 오류의 존재가 결론을 바꾸는가? A> = B가 거짓 인 경우에만과부동 소수점에 대한 관계 연산자 부정에 대한 단정

가와

가> = B가 반드시있는 < B에 해당되는 < = B가 false 인 경우 만한다면

A> B가 참 사실은 == B는 == B가 세 번째 경우 F

참일 경우

< = B 반드시 사실 참이면 예를 들어, "a == b가 맞다"는 말은 항상 "a> = b가 맞다"는 뜻입니까?

편집 :

a 또는 b가 NaN 또는 Inf를하지도 가정한다.

편집 2 :

1985 년에 IEEE 754 표준 읽은 후, 나는 다음을 발견했다. 모든

먼저, 다음

비교가 정확하고 결코 오버 플로우 나 언더 플로우 말했다.

비교를 할 때 수치 오류를 고려하지 않았으므로 숫자가있는 그대로 비교됩니다. a - b과 같은 덧셈과 뺄셈은 수치 오류가 무엇인지 정의하기 위해 추가적인 노력이 필요하기 때문에 위의 인용문은 과 같은 비교가 이 아니며 a - b > 0이 맞는지 여부를 판단하여이 아닌 것으로 판단한다고 가정합니다. 제가 틀렸다면 알려주세요.

둘째, 서로 배타적 인 네 개의 표준 관계를 나열했습니다.

네 개의 상호 배타적 인 관계가 가능합니다 :보다 작음, 같음,보다 크고 순서가 없습니다. 마지막 케이스는 적어도 하나의 피연산자가 NaN 일 때 발생합니다. 모든 NaN은 정렬되지 않은 것을 자체를 포함하여 모든 것과 비교할 것입니다.

그런 다음 표 4에서이 4 가지 표준 관계에 따라 진리 값으로 ">"또는 "> ="과 같은 다양한 연산자를 정의했습니다.테이블에서 우리는 바로 다음과 같습니다과 단지의 경우 경우와 < b는 거짓 인 경우에만

< = B가 true> b는 false 인 경우

A> = B가 true

== B가

그래서 내 질문의 주장이 사실로 결론 지을 수에 해당하는 경우

모두 A> = B와 < = B 반드시 해당. 그러나, 나는 symmetricity가 맞는지 아닌지를 정의하는 표준에서 아무것도 찾을 수 없었다. 다른 방법으로, a > b에서 b < a이 사실인지 아닌지는 알 수 없습니다. 따라서 b < a is false에서 a <= b is true을 유도 할 방법이 없습니다. 그래서 다음은 항상 참인지, 영업의 주장에 더하여, 알고 관심 여부

< B에 해당하는 경우와 b> a가 true 인 경우에만

것 및 b> = A가 참일 경우 만 < = B가 참

EDIT 3

레가 @Mark Ransom에서 언급 한 것과 같은 비정규 숫자에 대한 위키피디아 페이지를 읽었습니다. 현재의 비정규 숫자의 존재는 위의 결론을 바꾸지 않습니다. 다른 방법으로 일부 하드웨어가 비정규 숫자를 완벽하게 지원한다고 주장하는 경우 비교 연산자의 정의가 위의 표준을 만족하는지 확인해야합니다.

EDIT 4 :

난 그냥 IEEE 754의 2008 년 개정을 읽고, 그것은 하나 대칭성에 대해 아무 말도하지 않습니다. 그래서 이것은 정의되지 않은 것 같습니다.

(위의 설명은 모든 피연산자에 NaN 또는 Inf가 없다고 가정 함).

+2

'NaN'을 사용하면 위의 어설 션이 실패합니다. –

+0

고맙습니다. nan과 inf가없는 경우는 어때요? – shaoyl85

+1

http://stackoverflow.com/questions/1565164 또한 – pmeerw

답변

2

두 숫자가 모두 NaN 또는 무한대가 아닌 경우 IEEE 호환 시스템이있는 경우 어설 션이 유지됩니다. 기준에 언급되지 않았다면 언급할만한 가치가 없다는 것이 충분히 분명했기 때문이라고 확신합니다. 특히 "a < b"와 "b> a"가 NaN 및 무한대의 경우에도 동일한 값을 가지지 않으면 우리는 미친 도시에 있습니다.

비정상적인 결과는 IEEE 호환성을 가정 할 때 비정규 지원이 주어 지므로 결론에 영향을 미치지 않습니다.

내가 생각할 수있는 유일한 위험은 x87 FPU가 관련된 경우이며 이상한 80 비트 길이의 이중 형식입니다. 80 비트 길이의 두 배에서 반올림 두 번이나 때때로 생략 있도록 플로트, 비싼, 그리고이 발사 같은 어설으로 이어질 수 있습니다합니다 :

assert(sqrt(val) == sqrt(val)); 

그것은 발사 할 수 있기 때문에 첫 번째 SQRT의 결과() 호출은 메모리에 기록 될 수 있으므로 부동 또는 이중으로 반올림됩니다. 그런 다음 반올림되지 않을 수도있는 두 번째 sqrt() 호출의 결과와 비교됩니다. 그러나 sqrt()가 float 또는 double을 반환하면 비교를 수행하기 전에 두 번째 sqrt() 호출의 결과를 반올림하지 못하면 엄격하게 말하면 IEEE 준수가 아닙니다.

무한대는 두 숫자가 무한대 인 경우에만 문제가되어야합니다.