Пытался разложить дробное число на целое и десятичный остаток при вводе 1.4 или 1.2 результат не правильный, а именно при преобразования типа (для потери остатка) он портится . Есть ли этому обьяснение? Код (Text): #include <iostream> #include "windows.h" using namespace std; void myfun (double a) { int c; double b; c=(int)a; b=a-c; b=b*10; //b+=0.0001; if (b<0)b*=-1; cout <<" "<<(int)b<<endl<<c<<"-----\n "<<10<<endl;//преобразование (int)b глючит } int main () { double a; cout<<"number:"; cin >>a; myfun (a); return 0; }
Судя по всему, число 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)
Ессно есть. 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, но близкое к нему число.
добавить не получится. неизвестно, с какой точностью хранится число. надо округлять до необходимого числа знаков после запятой.