Удаление остатка, преобразование типов

Тема в разделе "LANGS.C", создана пользователем Perre, 21 ноя 2007.

  1. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    Пытался разложить дробное число на целое и десятичный остаток при вводе 1.4 или 1.2 результат не правильный, а именно при преобразования типа (для потери остатка) он портится . Есть ли этому обьяснение?

    Код (Text):
    1. #include <iostream>
    2. #include "windows.h"
    3. using namespace std;
    4.  
    5. void myfun (double a)
    6. {
    7.     int c;
    8.     double b;
    9.     c=(int)a;
    10.     b=a-c;
    11.     b=b*10;
    12. //b+=0.0001;
    13. if (b<0)b*=-1;
    14.     cout <<"     "<<(int)b<<endl<<c<<"-----\n     "<<10<<endl;//преобразование (int)b глючит
    15. }
    16.  
    17.  
    18. int main ()
    19. {
    20.      double a;
    21.      cout<<"number:";
    22.     cin >>a;
    23.     myfun (a);
    24.     return 0;
    25. }
     
  2. 10110111

    10110111 New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2006
    Сообщения:
    319
    Адрес:
    Санкт-Петербург
    Судя по всему, число 1.4 непредставимо как 1.4 в двоичном виде. оно представляется cin'ом как a=1.3999999999999999. (int)((a-b)*10)=floor(3.999999999999999)=3.
    С 1.2 ошибка погрешности при вычитании (при выполнении которого освобождается один бит точности, что приводит к тому же самому, что с 1.4).
    Исправить можно, подставляя в cout вместо (int)b (int)(b+.5)
     
  3. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Ессно есть.
    4/10 невозможно представить без потерь через делитель, являющийся степенью двойки, т.е. здесь это число представляется в виде периода, например, в двоичной системе: 0.0110(0110), ну, или в какой-нибудь 4-ой с-ме: 0.12(12).
    Соотв-но, чем длиннее ряд
    0/2 + 1/4 + 1/8 + 0/16 + 0/32 + 1/64 + 1/128 + 0/256 + ...,
    тем выше точность, но всё равно это "не настоящая" 0.4, но близкое к нему число.
     
  4. Perre

    Perre New Member

    Публикаций:
    0
    Регистрация:
    6 апр 2007
    Сообщения:
    100
    какую минимальную дробную часть надо добавить для правельности?
     
  5. t00x

    t00x New Member

    Публикаций:
    0
    Регистрация:
    15 фев 2007
    Сообщения:
    1.921
    добавить не получится. неизвестно, с какой точностью хранится число. надо округлять до необходимого числа знаков после запятой.