CannibalSmith ([info]cannibalsmith) rakstīja [info]koderi kopienā,
@ 2008-10-29 11:07:00

Previous Entry  Add to memories!  Tell a Friend!  Next Entry
vidējais aritmētiskais
short a, b, c;
c = (a + b) / 2;
c = a / 2 + b / 2;
c = ((int)a + b) / 2;
1. būs gļuks, ja a + b > 32767.
2. tiek zaudēts 1 bits precizitātes.
3. ir pareizākais veids, kā to darīt.

Vai manas tēzes ir pareizas?


(Ierakstīt jaunu komentāru)


[info]bubu
2008-10-29 13:36 (saite)
C++'ā integral tipi, kas mazāki (bitu garumā) par int automātiski kāstojas uz int, pirms izdarīt aritmētiskas izteikmes (+ - * /). Respektīvi 1-ais variants būs ekvivalents 3-šajam. Tas attiecas arī uz bool, char, whcar_t saskaitīšanu, kā arī uz unsigned char/short.
2-ais gan izpilda pilnīgi savādāku formulu nekā 3-šais.
Matemātiski to varētu pierakstīt kā floor(a/2.0)+floor(b/2.0) atšķirībā no floor((a+b)/2.0). Jo integeru dalīšana apaļojas uz leju.

Par C gan nezināšu.

Quotes iz C++ standarta:

Expressions - http://www.kuzbass.ru:8086/docs/isocpp/expr.html
-9- Many binary operators that expect operands of arithmetic or enumeration type cause conversions and yield result types in a similar way. The purpose is to yield a common type, which is also the type of the result. This pattern is called the usual arithmetic conversions, which are defined as follows:
[..]
* otherwise, the integral promotions (conv.prom) shall be performed on both operands.*

Integral promotions - http://www.kuzbass.ru:8086/docs/isocpp/conv.html#conv.prom
-1- An rvalue of type char, signed char, unsigned char, short int, or unsigned short int can be converted to an rvalue of type int [..]


RTFM :)

(Atbildēt uz šo) (Diskusija)


[info]cannibalsmith
2008-10-29 13:48 (saite)
Izmeļoši. Paldies.

(Atbildēt uz šo) (Iepriekšējais)


Neesi iežurnalējies. Iežurnalēties?