Первое:
я так и невпёр в приматскую шуточку:
как разбить float на два числа о0 я понимаю разбить int - это
факторизация.
Для флоата нам досточно узнать число знаков после запятой (1.23 = 123/100)
Попытки поколдовать с последовательным сдвигом FP путём умножения на 10 и вычисления разницы между floor() и получившимся числом проваливаются из-за точности.
Т.е. я хотел бы так:
1.23 преобразуем:
0 1.23-1=0.23 далее
1 12.3-12=0.3 далее
2 123-123=0 готово //хрен!
Прочитал ТЗ ещё раз. Собственно индусоидность кода нигде не фиксируется (как и используемые функции СИ++). Нахреначил говнокодище.
char t[30];
sprintf(t,"%f",x);
char* ptr=strstr(t,".");
int n=ptr-(char*)t;
int m;
for(m=strlen(t)-1;m>n;m--){
if(t[m]!='0')break;
}
int d=m-n;
this->up=x*pow(10,d);
this->down=pow(10,d);
единственное что напрягает - во всех ли платформах юзается точка как десятичный разделитель?
Второе:
Дробное число. Числитель и знаменатель - 10 бит целые.
|
Это чо-чо? Битовые поля что-ли?
short up:10;
short down:10;
Проблема перемещается в функцию вывода - необходимо выковрять 10 значащих бит из 16-битного слова. Просто замаскировать их не вышло - хрен его знает как оргнизовал это дело компилятор (или же надо круить rfc для шортов?), но ождиаемый эффект конструкция &1023 не дала.
Потому я просто забил =\
Вот что вышло в итоге:
файл
NUMBER.h
#ifndef _NUMBER_H_
#define _NUMBER_H_
class NUMBER{
private:
short up;
short down;
public:
NUMBER(float x);
NUMBER(int Up,int Down);
NUMBER operator+(const NUMBER &x);
NUMBER operator-(const NUMBER &x);
NUMBER operator*(const NUMBER &x);
NUMBER operator*(int x);
void PRINT();
};
#endif
файл
NUMBER.cpp
#include<iostream.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include"NUMBER.h"
NUMBER::NUMBER(int Up,int Down){
this->down=Down;
this->up=Up;
}
NUMBER::NUMBER(float x){
char t[30];
sprintf(t,"%f",x);
char* ptr=strstr(t,".");
int n=ptr-(char*)t;
int m;
for(m=strlen(t)-1;m>n;m--){
if(t[m]!='0')break;
}
int d=m-n;
this->up=x*pow(10,d);
this->down=pow(10,d);
}
void NUMBER::PRINT(){
cout<<(this->up)<<" / "<<(this->down)<<endl;
}
NUMBER NUMBER::operator +(const NUMBER &x){
return NUMBER(x.up*this->down+this->up*x.down,x.down*this->down);
}
NUMBER NUMBER::operator -(const NUMBER &x){
return NUMBER(x.up*this->down-this->up*x.down,x.down*this->down);
}
NUMBER NUMBER::operator *(const NUMBER &x){
return NUMBER(x.up*this->up,x.down*this->down);
}
NUMBER NUMBER::operator *(int x){
return NUMBER(x*this->up,this->down);
}
файл
main.cpp
#include<iostream.h>
#include<math.h>
#include<conio.h>
#include"NUMBER.h"
void main(){
NUMBER Q(1.3);
Q.PRINT();
NUMBER R=Q*2;
R.PRINT();
NUMBER T(6,5);
T.PRINT();
NUMBER Z=R-T*2;
Z.PRINT();
NUMBER F=Z+T;
F.PRINT();
getch();
}