2016-03-01 14 views
5

Mam pytanie, które może zaoszczędzić sporo czasu dla wielu ludzi debugowania ...C: odjąć od całkowitej podwójnie

Biorąc pod uwagę funkcję:

void my_func(double value) 

Czy jest jakaś różnica między 2 następne linie kodu?

double my_value = 1 - value; 

i

double my_value = 1.0 - value; 

Tj Biorąc pod uwagę, że value jest double, jeśli używam 1 - value, czy mogę się czuć bezpiecznie, że wynik będzie prawidłową liczbą rzeczywistą, na przykład podczas korzystania z 1.0 - value?

Odpowiedz

11

Nie ma różnicy. Aby odjąć numer double od int, musi on zostać oznaczony jako double. Osobiście wolę używać 1.0, ponieważ myślę, że to czyni jaśniejszym, że nie jest to odejmowanie całkowite. Ale to tylko kwestia stylu.

+0

Dziękuję bardzo za jasną i szczegółową odpowiedź! – vav

+1

Myślę, że "czyni to jaśniejszym" jest _ ** bardzo ** ważne_, ponieważ _someone_ przyjdzie później i zobaczy "1-wartość" i będzie zdezorientowany. Ponadto, jeśli 'double my_value = 1 - value;' jest sposobem poniżej deklaracji funkcji 'void my_func (double value)', być może będziesz musiał spojrzeć wstecz, aby zobaczyć, jaki typ 'value' faktycznie ma na celu zrozumienie instrukcji. Zawsze używałbym '1.0 - value'. –

+0

@StephenP, całkowicie się z Tobą zgadzam – vav

3

Tak, zakładasz poprawnie, ale dla bardziej złożonych wyrażeń musisz być bardzo ostrożny przy mieszaniu wartości całkowitych i zmiennoprzecinkowych. Na przykład niewinne kod poszukuje:

double x = 1/2; 

będzie przechowywać 0 do x ponieważ obliczanie odbywa się na int wartości, a wynik jest przekształcany do double.

+0

Dziękuję bardzo – vav

1

Jeśli dowolny operand operatora arytmetycznego jest zmiennoprzecinkowy, obliczenia wykonywane są w arytmetyce zmiennoprzecinkowej. Obliczenia są wykonywane podwójnie, chyba że oba argumenty są zmienne, w takim przypadku obliczenia odbywają się w trybie zmiennoprzecinkowym.

+2

długie podwójne, jeśli jeden z operandów jest długi podwójny. – gnasher729

+0

Nie mam wystarczającej reputacji, aby głosować w górę, dlatego po prostu komentuję podziękowania wszystkim, którzy dobrze mi odpowiedzą – vav

+0

@ gnasher729 "długi podwójny" jest istotny tylko wtedy, gdy instrukcja non-SSE jest używana dla rozszerzonej precyzji zmiennoprzecinkowej. Jeśli nie możesz kontrolować, czy używany jest koprocesor 8087 (instrukcje 80-bitowe) lub instrukcje SSE (dokładność 64-bitowa), nie znasz aktualnej dokładności wyniku. Jeśli użyto SSE "długi podwójny" będzie taki sam jak "podwójny". – cwschmidt

3

Masz rację. Operator - działa na obiektach tego samego typu. Istnieje tu niejawna konwersacja typu, a int jest konwertowane na podwójne.

Należy zauważyć, że może to być źródłem błędów podczas mieszania typów podpisanych i niepodpisanych.

+0

Dziękuję za odpowiedź – vav

+0

Chętnie pomogę :) – DevShark

3

W przykładzie jak będzie zachowywać się w ten sam sposób

Tj biorąc pod uwagę, że wartość jest podwójna, jeśli używam wartości 1 - czy mogę być pewny, że wynik będzie prawidłową liczbą rzeczywistą, np. przy użyciu wartości 1,0?

Z 1.0 - value również nie można zagwarantować, że będzie to poprawna liczba rzeczywista. Sprawdź dokument dla wersji Floating-Point Arithmetic.