Помощь - Поиск - Пользователи - Календарь
Полная версия: переввод дробей с 2 в 10 с.с.
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
MiX
Вобщем нужно написать програму что б переводила дроби с 2 в 10 с.с
Я вот написал но чтото здесь нитак
Помогите пожалуста найти ошыбки, или может ктото знает чтоб зделать как то по другому
Код

var h,r,a:real;
n,z,x,i:longint;
errcode:integer;
q,w,s: string;
begin
readln(s);
n:=pos('.',s);
q:=copy(s,1,n);
w:=copy(s,n,length(s)-n);
val(q,z,errcode);
for i:=1 to (n-1) do
begin
x:=z mod 10;
z:=z div 10;
r:=exp(ln(2)*i)*z+r;
end;
val(w,z,errcode);
for i:=n+1 to length(s)-n do
begin
x:=z mod 10;
z:=z div 10;
a:=1/(exp(ln(2)*i))*z+a;
end;
h:=a+r;
   writeln(h);
end.
volvo
Ну, по правилам перевода из двоичной в десятичную (см. Здесь (Википедия)), надо бы делать так:

var
s, int_part, fraq_part: string;
p: longint;
q: real;
_result: real;
begin
// readln(s);
s := '1100.011';
int_part := copy(s, 1, pos('.', s) - 1);
fraq_part := copy(s, pos('.', s) + 1, 255);

_result := 0.0;

p := 1;
while int_part <> '' do begin
_result := _result + (ord(int_part[length(int_part)]) - ord('0')) * p;
delete(int_part, length(int_part), 1);
p := p * 2;
end;

writeln(_result:10:5);

q := 1 / 2;
while fraq_part <> '' do begin
_result := _result + (ord(fraq_part[1]) - ord('0')) * q;
delete(fraq_part, 1, 1);
q := q / 2;
end;

writeln(_result:10:5);
end.

MiX
она неправильно работает:
я ввожу 0,111, должно выводить 0,875 а оно выводит совсем не то... blink.gif
volvo
Правда что-ли? Почему тогда:

Нажмите для просмотра прикрепленного файла

?
Запятую что-ли вводил? Напрасно. Точка нужна...
MiX
Я извиняюсь, незаметил...
Вопрос следующий:
как эту же прогу написать что б выводила с точностю до 0.00000005 ?? blink.gif
volvo
То есть, ты имеешь в виду, чтобы при вводе
s := '0.1111111111111111111111111111111111';
программа выводила бы:

" 0.9999999404", а не " 0.999999999941792" как без этого ограничения? Тогда исправить условие второго цикла:

while (fraq_part <> '') and (q > 0.00000005) do begin
// сам цикл остается прежним
end;

// и изменить формат вывода:
writeln(_result:18:10);


MiX
я имею ввиду шоб оно не выводило больше цыфр посе комы чем в ограничении тоисть 8 и последнюю цыфру автоматически меняло на 5 или 0, тоисть еси n>5 то 0, а еси n<5 то на 5 (n - последняя цыфра)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.