Oto dwie implementacje funkcji interpolacji. Argument u1
jest zawsze między 0.
i 1.
.Właściwości 80-bitowych rozszerzonych obliczeń precyzyjnych, począwszy od argumentów podwójnej precyzji
#include <stdio.h>
double interpol_64(double u1, double u2, double u3)
{
return u2 * (1.0 - u1) + u1 * u3;
}
double interpol_80(double u1, double u2, double u3)
{
return u2 * (1.0 - (long double)u1) + u1 * (long double)u3;
}
int main()
{
double y64,y80,u1,u2,u3;
u1 = 0.025;
u2 = 0.195;
u3 = 0.195;
y64 = interpol_64(u1, u2, u3);
y80 = interpol_80(u1, u2, u3);
printf("u2: %a\ny64:%a\ny80:%a\n", u2, y64, y80);
}
na ścisłej IEEE 754 platformie z 80-bitowymi long double
s, wszystkie obliczenia wykonywane są w interpol_64()
według IEEE 754 podwójnej precyzji, aw interpol_80()
w 80-bitowej precyzji rozszerzonego. drukuje programowe:
u2: 0x1.8f5c28f5c28f6p-3
y64:0x1.8f5c28f5c28f5p-3
y80:0x1.8f5c28f5c28f6p-3
Jestem zainteresowany w nieruchomości „wynik zwrócony przez funkcję jest zawsze pomiędzy u2
i u3
”. Ta właściwość ma wartość false wynoszącą interpol_64()
, co pokazują wartości w powyższym zbiorze wartości .
Czy nieruchomość ma szansę być prawdziwa z interpol_80()
? Jeśli nie, to co jest kontrprzykładem? Czy to pomaga, jeśli wiemy, że istnieje między nimi minimalna odległość? Czy istnieje metoda określania znaczenia i szerokości dla obliczeń pośrednich, przy których właściwość będzie gwarantowana?
EDYTOWANIE: dla wszystkich wartości losowych, które wypróbowałem, właściwość zatrzymana, gdy obliczenia pośrednie zostały wykonane wewnętrznie w rozszerzonej precyzji. Jeśli interpol_80()
zajął argumenty, byłoby stosunkowo łatwo zbudować kontrprzykład, ale tutaj jest pytanie o funkcję, która pobiera argumenty double
. To sprawia, że znacznie trudniej jest zbudować kontrprzykład, jeśli taki istnieje.
Uwaga: generujące kompilator instrukcje x87 może generować ten sam kod interpol_64()
i interpol_80()
, ale to jest styczny do mojego pytania.
Czy jesteś pewien, że ten program naprawdę wykorzystuje 80 bitów precyzji? Nowoczesne urządzenia Intel/AMD IIRC mają wbudowane 128-punktowe jednostki, które mają SSE i przyjaciół. – fuz
@FUZxxl "128-bitowe jednostki FP" oznaczają wektory dwóch podwójnych precyzji lub 4 pojedynczych liczb precyzyjnych. Ale żeby odpowiedzieć na twoje pytanie, tak, jestem pewien. Zestaw jest tutaj: http://pastebin.com/GaM20WZS –
+1 dla zawartości i prezentacji –