Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Задачи _ переввод дробей с 2 в 10 с.с.

Автор: MiX 23.09.2007 22:31

Вобщем нужно написать програму что б переводила дроби с 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 23.09.2007 23:34

Ну, по правилам перевода из двоичной в десятичную (см. http://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_%D1%81%D1%87%D0%B8%D1%81%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F), надо бы делать так:

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 27.09.2007 23:16

она неправильно работает:
я ввожу 0,111, должно выводить 0,875 а оно выводит совсем не то... blink.gif

Автор: volvo 27.09.2007 23:34

Правда что-ли? Почему тогда:

Прикрепленное изображение

?
Запятую что-ли вводил? Напрасно. Точка нужна...

Автор: MiX 29.09.2007 21:13

Я извиняюсь, незаметил...
Вопрос следующий:
как эту же прогу написать что б выводила с точностю до 0.00000005 ?? blink.gif

Автор: volvo 29.09.2007 21:24

То есть, ты имеешь в виду, чтобы при вводе

s := '0.1111111111111111111111111111111111';
программа выводила бы:

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

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

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



Автор: MiX 1.10.2007 19:55

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