sqrt(1) - wynik

0

Czy w c++11 wynik std::sqrt(1) może być inny niż 1?
Chodzi mi o to czy możliwe jest, że operacja ta zwróci powiedzmy 0.99999999(9)?
Jeśli tak to od czego to zależy? Od maszyny, od systemu operacyjnego czy od wersji kompilatora?

2

dawaj konkretny kod z którym masz kłopot.
sqrt(1)=1 zawsze. Ale zapewne ty masz sqrt(0.9999999999999) tylko nie widzisz tego od razu.

3

std::sqrt przyjmuje argument i zwraca wartość o typie float, double albo long double. To oznacza, że to co przyjmuje jak i to co zwraca podlega regułom arytmetyki zmiennoprzecinkowej, która ma swoje mankamanty. Np. to, że nie każdą wartość można odwzorować.

W standardzie IEEE-754 (którego użycie nie jest gwarantowane) 1 to dokładnie 1.0 bo tę liczbę da się odwzorować. std::sqrt, da wtedy 1.0 na wyjściu i to jest gwarantowane (zaznaczam: w IEEE-754). Ale przede wszystkim musisz podać dokładnie 1.0 a to wcale nie musi być takie oczywiste, szczególnie, jeżeli argument pochodzi z jakiś innych obliczeń.

Np. http://ideone.com/NylMsH

0
Świetny Młot napisał(a):

Czy w c++11 wynik std::sqrt(1) może być inny niż 1?
Chodzi mi o to czy możliwe jest, że operacja ta zwróci powiedzmy 0.99999999(9)?
Jeśli tak to od czego to zależy? Od maszyny, od systemu operacyjnego czy od wersji kompilatora?

liczby całkowite są raczej reprezentowane dokładnie... do około 2^53 dla typu double.
w każdym razie 1 na pewno jest tam 1, a nie jakieś tam 0.99999999999, czy inne g**no.

20 = 1
tylko że w praktyce jest kodowane zwykle jako: 1 = 2 * 0.5, czyli 21 x 0.1b;

natomiast np. z liczbą 7 będzie chyba tak:
7 = 1 + 2 + 4 = 111b
co można zapisać również tak:
2 x 11.1b = 4 x 1.11b = 8 x 0.111b

zatem w reprezentacji zmiennoprzecinkowej będzie to ostatnie.

2^cecha x mantysa; gdzie mantysa jest od 0.5 = 0.1b do 0.111111111111....111111111111b = 1 - eps;

1 użytkowników online, w tym zalogowanych: 0, gości: 1