W kodzie stworzonym przez Apple jest taka linia:
CMTimeMakeWithSeconds( newDurationSeconds, 1000*1000*1000 )
Czy jest jakiś powód, aby wyrazić 1,000,000,000
jako 1000*1000*1000
?
Dlaczego nie 1000^3
o to chodzi?
objective-c
c
integer
literals
kaczka
źródło
źródło
1_000_000_000
. Jednak przy stałych czasowych jest to trudniejsze. Łatwiej jest pisać30 * 60
(30 minut w sekundach) niż pisać1800
. W rzeczywistości istnieją języki, które pozwolą ci pisać jednostki, np.meters
Pozwalając ci chronić się przed złymi zadaniami.^
jest XOR, a nie wykładnikiem ani operatorem potęgi.Odpowiedzi:
Jednym z powodów deklarowania stałych w sposób multiplikatywny jest poprawa czytelności bez wpływu na wydajność w czasie wykonywania. Również po to, by wskazać, że pisarz myślał o liczbie w sposób multiplikatywny.
Rozważ to:
Jest wyraźnie lepszy niż:
ponieważ ta ostatnia nie wygląda na pierwszy rzut oka na trzecią potęgę 1024.
Jak wspomniał Amin Negm-Awad,
^
operatorem jest binarnyXOR
. W wielu językach brakuje wbudowanego operatora potęgowania w czasie kompilacji, stąd mnożenie.źródło
x
aby uzyskać rozmiar podzakresu ... i nagle masz ułamek bajt, który może wymagać dodatkowej logiki do skompensowania.Wynik
1000^3
to 1003.^
jest operatorem bit-XOR.Nawet to nie dotyczy samego Q, dodaję wyjaśnienie.
x^y
nie nie zawsze ocenia sięx+y
tak jak w przykładzie pytający użytkownika. Musisz wszystko xorować. W przypadku przykładu:Ale
źródło
^
Środki napędu XOR C / C ++ / cel-C itd. W kalkulatorów zwykle środki zasilania x do-Y.Istnieją powody, aby nie używać
1000 * 1000 * 1000
.Z 16-bitowymi
int
,1000 * 1000
przelewa. Dlatego używanie1000 * 1000 * 1000
ogranicza przenośność.W przypadku wersji 32-bitowej
int
następuje przepełnienie pierwszego wiersza kodu.Zaproponuj, aby wartość wiodąca odpowiadała typowi miejsca docelowego pod względem czytelności, przenośności i poprawności.
Można również użyć prostej
e
notacji dla wartości, które są dokładnie reprezentowane jakodouble
. Oczywiście prowadzi to do wiedzy, czydouble
może dokładnie reprezentować wartość liczby całkowitej - coś niepokojącego w przypadku wartości większych niż 1e9. (ZobaczDBL_EPSILON
iDBL_DIG
).źródło
double
może dokładnie reprezentować wszystkie liczby całkowite do 2 ^ 53 ≈ 9e15.double
użycia binary64, mimo że jest on bardzo powszechnie używany. Zgodnie ze specyfikacją C, wartości do 1e9 lub więcej są dokładnie reprezentowalne. Zależy to od tego, czy chcesz kodować zgodnie ze specyfikacją, czy polegać na powszechnej praktyce.1000
i1000000000000
są stałymi liczbami całkowitymi . Każdy niezależnie ma rodzaj wybrany zint
,long
lublong long
. Kompilator używa pierwszego typu z tych 3, w których mieści się stała całkowita .1000 * 1000 * 1000 * 1000
odbywa się zint
matematyką, jak każdy1000
w plikuint
. Produkt przepełnia 32-bitowyint
.1000000000000
z pewnością można przedstawić jakolong long
(lub węższy) - brak przepełnienia. Typ celulong long Duration
nie wpływa na tę „prawą stronę oznaczenia =”.int
,long x = 1000 * 1000 * 1000L;
by przelewać, natomiastlong x = 1000L * 1000 * 1000;
nie.Dla czytelności.
Umieszczenie przecinków i spacji między zerami (
1 000 000 000
lub1,000,000,000
) spowodowałoby błąd składniowy, a umieszczenie1000000000
w kodzie utrudnia dokładne sprawdzenie, ile jest zer.1000*1000*1000
pokazuje, że jest to 10 ^ 9, ponieważ nasze oczy mogą łatwiej przetwarzać fragmenty. Ponadto nie ma żadnych kosztów wykonania, ponieważ kompilator zastąpi go stałą1000000000
.źródło
1,000,000,000
nie spowodowałoby błędu składniowego, oznaczałoby po prostu coś innego. Na przykładCMTimeMakeWithSeconds( newDurationSeconds, 1,000,000,000 )
1_000_000_000
_
się separatorem :)'
separator w C ++ 14, więc możesz użyć1'000'000'000
. (Został wybrany, ponieważ1,000,000,000
mógł zostać błędnie zinterpretowany jako operator przecinka lub 4 różne parametry i_1_000_000_000
jest prawidłową (ale prawdopodobnie złą) nazwą zmiennej.)Dla czytelności. Dla porównania, Java obsługuje
_
liczby w celu poprawy czytelności (po raz pierwszy zaproponowane przez Stephena Colebourne jako odpowiedź na PROPOZYCJĘ Dereka Fostera: Binary Literals for Project Coin / JSR 334).1_000_000_000
Tutaj można by pisać .W przybliżeniu w porządku chronologicznym, od najstarszego wsparcia do najnowszego:
"(1)1111 1111"
( najwyraźniej nie dla wartości dziesiętnych, tylko dla ciągów bitowych reprezentujących wartości binarne, kwartalne, ósemkowe lub szesnastkowe )1$000$000
1_000_000_000
1'000'000'000
Jest to stosunkowo nowa funkcja dla języków, aby zdać sobie sprawę, że powinny obsługiwać (a także jest Perl). Jak w doskonałej odpowiedzi chux @,
1000*1000...
jest to częściowe rozwiązanie, ale otwiera programistę na błędy wynikające z przepełnienia mnożenia, nawet jeśli wynik końcowy jest duży.źródło
Może być łatwiejsze do przeczytania i skojarzenia z
1,000,000,000
formularzem.Z technicznego punktu widzenia wydaje mi się, że nie ma różnicy między bezpośrednią liczbą a mnożeniem. Kompilator i tak wygeneruje ją jako stałą liczbę miliardów.
Jeśli mówisz o celu-c, to
1000^3
nie zadziała, ponieważ nie ma takiej składni dla pow (jest to xor). Zamiast tegopow()
można użyć funkcji. Ale w takim przypadku nie będzie optymalna, będzie to wywołanie funkcji wykonawczej, a nie stała wygenerowana przez kompilator.źródło
Aby zilustrować powody, rozważ następujący program testowy:
źródło
Innym sposobem osiągnięcia podobnego efektu w C dla liczb dziesiętnych jest użycie dosłownej notacji zmiennoprzecinkowej - o ile double może reprezentować żądaną liczbę bez utraty precyzji.
IEEE 754 64-bitowy double może bez problemu reprezentować dowolną nieujemną liczbę całkowitą <= 2 ^ 53. Zwykle długie podwójne (80 lub 128 bitów) może sięgać nawet dalej. Konwersje zostaną wykonane w czasie kompilacji, więc nie ma narzutu czasu wykonywania i prawdopodobnie otrzymasz ostrzeżenia, jeśli nastąpi nieoczekiwana utrata precyzji i masz dobry kompilator.
źródło