Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Zły wynik dla kodu: printf( "%.2lf", 4 / 9 )

Ostatnio zmodyfikowano 2015-02-04 19:50
Autor Wiadomość
antonio12
Temat założony przez niniejszego użytkownika
[C++] Zły wynik dla kodu: printf( "%.2lf", 4 / 9 )
» 2015-02-02 21:25:28
printf( "%.2lf", 4 / 9 );

Dlaczego program wypisuje 0.50 a nie 0.40 ? Bo przecież 4/9 to 0.44
P-125897
Monika90
» 2015-02-02 21:45:10
4/9 jest równe zero typu int, program ma niezdefiniowane zachowanie bo typ się nie zgadza, %lf wymaga double, a podajesz int
P-125898
DejaVu
» 2015-02-02 21:46:34
Bo nie rzutujesz do floata.

/edit:
Swoją drogą myślałem że to 21f, a nie 2lf :) Więc rzutowanie powinno być do double jak napisała Monika90.
P-125899
Monika90
» 2015-02-02 21:54:12
Może być też rzutowanie na float. Printf nie jest w stanie odróżnić między float a double, ponieważ float i tak jest konwertowane do double podczas przkazywania argumentów.
P-125900
antonio12
Temat założony przez niniejszego użytkownika
» 2015-02-02 22:10:32
Bo mam takie zadanie, chodzi o 4 wypis programu:

C/C++
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    int z1 = 4, z2 = 8;
    int m = 1;
    int t[ 10 ] = { - 1, - 2, - 3 };
    char s1[ 30 ] = "programowanie", s2[ 30 ] = "strukturalne";
    double z =( ++z2 -( z1-- ) ) %--z1;
    printf( "1) %.1lf\n", z / 3 );
    printf( "2) %d\n", --s1[ 2 ] <* s2 );
    printf( "3) %c\n", *( strlen( s1 ) - 4 + s1 ) );
    printf( "4) %.2lf\n", !( z1 % z2-- ) + 2.0 * z1 / z2 );
    printf( "5) %d\n",( 3 *( ++*( t + 2 ) >> 2 ) ) );
    printf( "6) %d\n", !( !z2 ||--z1 ) );
    return 0;
}

W 4 wypisie wyświetla 0.5

I jeszcze mam pytanie dotyczące 5 wypisu jak tam jest (++*(t+2)>>2) to dla mnie to wygląda na (-2>>2), a operatory bitowe są tylko do typu unsigned. Pomoże ktoś ?
P-125901
Monika90
» 2015-02-02 22:35:49
W której szkole dają takie zadania?

Czy jesteś pewien że dobrze przepisłeś? Brakuje #include <string.h>, brakuje średnika po ostatnim printf, a w przedostatnim jest /n zamiast \n

I jeszcze mam pytanie dotyczące 5 wypisu jak tam jest (++*(t+2)>>2) to dla mnie to wygląda na (-2>>2), a operatory bitowe są tylko do typu unsigned. Pomoże ktoś ?
Do signed też mozna ich używać, a w tym konkretnym przypadku wg 5.8p3

The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.
Czyli jaki tego będzie wynik, to musisz przeczytać w dokumentacji konkretnego kompilatora.
P-125903
antonio12
Temat założony przez niniejszego użytkownika
» 2015-02-02 23:15:21
już poprawiłem, tylko nie wiem czy ogarnę ten operat bitowy dla liczby ujemnej. Możesz pokazać jak to się robi ?
P-125909
Monika90
» 2015-02-02 23:29:32
-2 zapisanie w kodzie uzupełnienia do dwóch wygląda tak
11111111111111111111111111111110
po przesunieciu o dwie pozycje w prawo wygląda tak (bit znaku jest kopiowany)
11111111111111111111111111111111
a to jest -1, czyli -2>>2 jest równe -1

Ale tak naprawdę to wynik zależy od kompilatora.

I w ogóle to zadanie jest głupie i ma niezdefiniowane zachowanie.
P-125910
« 1 » 2 3
  Strona 1 z 3 Następna strona