Moja SSE-FPU generuje następujące Nans:Pytania dotyczące operacji na NaN
- Kiedy zrobić każdy podstawowy dwusystemowy jak ADDSD, SUBSD, MULSD lub DIVSD i jednym z obu operandów jest NaN, wynik ma znak operandu NaN, a niższe 51 bitów mantysy wyniku jest obciążone niższymi 51 bitami mantysy operandu NaN.
- Gdy obie operacje są NaN, wynik jest ładowany ze znakiem rejestru przeznaczenia, a niższe 51 bitów wynikowej mantysy jest ładowane z niższymi 51 bitami rejestru przeznaczenia przed operacją. Tak więc prawo asocjacyjne nie ma znaczenia przy wykonywaniu multiplikacji na dwóch operandach NaN!
- Kiedy wykonuję SQRTSD na wartości NaN, wynik ma znak operandu NaN, a niższe 51 bitów wyniku jest obciążone niższymi 51 bitami operandu.
- Kiedy robię mnożenie nieskończoności z zerową lub nieskończonością, zawsze otrzymuję -NaN (wynik binarny 0xFFF8000000000000u).
- Jeśli jakikolwiek operand jest sygnalizacyjnym NaN, wynik staje się cichym NaN, jeśli wyjątek nie jest maskowany.
Czy to zachowanie zostało określone w dowolnym miejscu standardu IEEE-754?
* wynik staje się cichym NaN, jeśli wyjątek nie jest maskowany *. Myślę, że masz na myśli "jeśli wyjątek jest maskowany *. Nie otrzymujesz wyniku z instrukcji wywołujących wyjątki matematyczne SSE. Myślę, że przynajmniej część z tego jest udokumentowana w [podręcznikach ISA Intela] (https: // www-ssl .intel.com/content/www/us/pl/procesory/architekci-software-developer-manuals.html), ale ciekawe pytanie o to, ile jest ono wymagane lub zasugerowane przez IEEE-754. –
Ponadto: Myślę, że masz na myśli przemiennie, aby opisać fakt, że normalnie wynik mul lub add nie zależy od tego, który argument jest celem (matematyka FP nie jest asocjacyjna nawet bez NaNs; 'a + b + c może nie być równy' c + b + a 'z powodu zaokrąglania w inny sposób) –