Разложение целой и дробной частей вещественных чисел по ячейкам матрицы

Вводятся пять вещественных чисел. Записать в первый столбец матрицы целую часть чисел, во второй — дробную часть, приведенную к пятизначному целому, в третий столбец — знак числа: 0 для положительных чисел и 1 — для отрицательных.

Например, если вводится число 3.234093, то в первой ячейке строки присваивается 3, второй присваивается 23409, а третьей — число 0.

В большинстве языков программирования предусмотрена функция, позволяющая отбросить дробную часть вещественного числа. А также функция, возвращающая абсолютное значение числа. С помощью этих двух функций можно получить целую часть введенного числа.

Для получения дробной части и приведения ее к пятизначному целому можно воспользоваться следующим алгоритмом:

  1. Получить целую часть числа.
  2. Вычесть ее из исходного числа, в результате чего получится вещественное число у которого целая часть равна 0.
  3. Умножить полученное вещественное число на 100000 (т.к. учитываются пять знаков после запятой).
  4. Снова отбросить дробную часть.
  5. Избавиться от знака.

Цикл заполнения матрицы не будет включать внутреннего цикла. Каждая из трех ячеек текущей строки заполняется отдельно по собственной «формуле».

Pascal



const
N = 5;
var
a: array[1..N,1..3] of longint;
f: real;
i,j: byte;

begin
for i:=1 to N do begin
read(f);
a[i,1] := abs(trunc(f));
a[i,2] := abs(trunc((f - trunc(f)) * 100000));
if f >= 0 then a[i,3] := 0
else a[i,3] := 1;
end;
writeln;
for i:=1 to N do begin
for j:=1 to 3 do
write(a[i,j],' ');
writeln;
end;
end.



-1.567 2.345667 3.2 9.0011 -2.2558015

1 56699 1
2 34566 0
3 20000 0
9 109 0
2 25580 1

Неточный вывод в 4-ой строке матрицы связан с проблемами двоичной арифметики.

Язык Си



#include < stdio.h>
#define N 5
main() {
int a[N][3], i, j;
float f;

for (i=0; i< N; i++) {
scanf("%f", &f);
a[i][0] = abs((int)f);
a[i][1] = abs((int)((f - a[i][0]) * 100000));
if (f >=0) a[i][2] = 0;
else a[i][2] = 1;
}

for (i=0; i< N; i++) {
for (j=0; j< 3; j++)
printf("%d ", a[i][j]);
printf("\n");
}
}



5.45 -4.34 9.03 0.45 -3.8903234
5 44999 0
4 834000 1
9 2999 0
0 45000 0
3 689032 1

Преобразование дробной части к целому сильно искажает результат.

Python



from random import random
N = 5
a = []
for i in range(N):
z = []
f = float(input())
z.append(abs(int(f)))
z.append(abs(int((f - int(f))*100000)))
if f >= 0:
z.append(0)
else:
z.append(1)
a.append(z)

for i in a:
print(i)



5.3452
-7.43525
-4.9458044
9.00022
4.45
[5, 34520, 0]
[7, 43524, 1]
[4, 94580, 1]
[9, 22, 0]
[4, 45000, 0]

КуМир


алг
нач
цел N=5
цел таб a[1:N,1:3]
цел i, j
вещ f
нц для i от 1 до N
ввод f
a[i,1] := int(abs(f))
a[i,2] := int((abs(f)-a[i,1]) * 100000)
если f >= 0 то a[i,3] := 0
иначе a[i,3] := 1 все
кц

вывод нс
нц для i от 1 до N
нц для j от 1 до 3
вывод a[i,j], " "
кц
вывод нс
кц
кон



4.4
1.000103
-3.999
-0.003421
2

4 40000 0
1 10 0
3 99900 1
0 342 1
2 0 0

Basic-256



dim a(5,3)
for i=0 to 4
input f
a[i,0] = abs(int(f))
a[i,1] = abs(int((f - int(f)) *100000))
if f >= 0 then
a[i,2] = 0
else
a[i,2] = 1
endif
next i

for i=0 to 4
for j=0 to 2
print a[i,j] + " ";
next j
print
next i



6.54
-4.5434535
0.00234
0.0300002
-1.90
6 54000 0
4 54345 1
0 234 0
0 3000 0
1 89999 1

В последней строке наблюдается эффект от двоичного представления вещественных чисел.

Подписаться
Уведомить о
guest

0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
Pascal


const
N = 5;
var
a: array[1..N,1..3] of longint;
f: real;
i,j: byte;

begin
for i:=1 to N do begin
read(f);
a[i,1] := abs(trunc(f));
a[i,2] := abs(trunc((f - trunc(f)) * 100000));
if f >= 0 then a[i,3] := 0
else a[i,3] := 1;
end;
writeln;
for i:=1 to N do begin
for j:=1 to 3 do
write(a[i,j],' ');
writeln;
end;
end.



-1.567 2.345667 3.2 9.0011 -2.2558015

1 56699 1
2 34566 0
3 20000 0
9 109 0
2 25580 1

Неточный вывод в 4-ой строке матрицы связан с проблемами двоичной арифметики.
Язык Си


#include < stdio.h>
#define N 5
main() {
int a[N][3], i, j;
float f;

for (i=0; i< N; i++) {
scanf("%f", &f);
a[i][0] = abs((int)f);
a[i][1] = abs((int)((f - a[i][0]) * 100000));
if (f >=0) a[i][2] = 0;
else a[i][2] = 1;
}

for (i=0; i< N; i++) {
for (j=0; j< 3; j++)
printf("%d ", a[i][j]);
printf("\n");
}
}



5.45 -4.34 9.03 0.45 -3.8903234
5 44999 0
4 834000 1
9 2999 0
0 45000 0
3 689032 1

Преобразование дробной части к целому сильно искажает результат.
Python


from random import random
N = 5
a = []
for i in range(N):
z = []
f = float(input())
z.append(abs(int(f)))
z.append(abs(int((f - int(f))*100000)))
if f >= 0:
z.append(0)
else:
z.append(1)
a.append(z)

for i in a:
print(i)



5.3452
-7.43525
-4.9458044
9.00022
4.45
[5, 34520, 0]
[7, 43524, 1]
[4, 94580, 1]
[9, 22, 0]
[4, 45000, 0]
КуМир

алг
нач
цел N=5
цел таб a[1:N,1:3]
цел i, j
вещ f
нц для i от 1 до N
ввод f
a[i,1] := int(abs(f))
a[i,2] := int((abs(f)-a[i,1]) * 100000)
если f >= 0 то a[i,3] := 0
иначе a[i,3] := 1 все
кц

вывод нс
нц для i от 1 до N
нц для j от 1 до 3
вывод a[i,j], " "
кц
вывод нс
кц
кон



4.4
1.000103
-3.999
-0.003421
2

4 40000 0
1 10 0
3 99900 1
0 342 1
2 0 0
Basic-256


dim a(5,3)
for i=0 to 4
input f
a[i,0] = abs(int(f))
a[i,1] = abs(int((f - int(f)) *100000))
if f >= 0 then
a[i,2] = 0
else
a[i,2] = 1
endif
next i

for i=0 to 4
for j=0 to 2
print a[i,j] + " ";
next j
print
next i



6.54
-4.5434535
0.00234
0.0300002
-1.90
6 54000 0
4 54345 1
0 234 0
0 3000 0
1 89999 1

В последней строке наблюдается эффект от двоичного представления вещественных чисел.