Skip to main content

3. Геометрия

Теория

Хранение вещественных чисел в оперативной памяти - далеко не такая простая задача, как хранение целых.

Можно придумать много разных способов хранения вещественных чисел, но все они сводятся к одному и тому же ограничению. Любое вещественное число мы можем хранить до определённой степени точности.

Строго говоря, вещественными числами в программировании называются рациональные.

В любом случае нам придётся хранить сами цифры числа, а также место, куда следует поставить точку.

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

X=S×M×Nq,X = S\times M\times N^q,

где XX – вещественное число, SS - знак числа, MM - мантисса числа, NN - основание системы счисления, а qq - степень, часто называется порядком.

Например, в числе 6.6261×10276.6261\times 10^{-27} мантисса M=6.6261M=6.6261, основание N=10N=10, степень q=27q=-27, знак S=1S=1.

По общему соглашению 0.1M<100.1 \le M\lt 10. Это позволяет не определять, где стоит точка в мантиссе. Она всегда будет после первой цифры.

Процессоры работают только с числами, у которых NN равно 22.

В java есть два типа данных: float и double. Первый - это вещественные данные одинарной точности, второй - двойной. Обычно используется double.

xor

Чтобы задать значение типа float, необходимо добавить в конце добавить литерал f:

    float f = 1.0f;

Первый бит всегда задаёт знак числа.

Битыfloatdouble
Знак11
Степень(Экспонента)811
Мантисса2352

Подробная информация по типам данных java представлена в следующей таблице:

ТипРазмерЗначение по умолчаниюТочностьЗначащие цифрыДиапазон
float32 бита (4 байта)0.0fЕдиничная6от 3.4e-038 до 3.4e+038
double64 бита (8 байт)0.0dДвойная15от 1.7e-308 до 1.7e+308

Операции над вещественными числами, представленными в экспоненциальной форме довольно муторные в плане реализации на логических элементах, о них можно прочитать здесь и здесь

Чтобы вывести вещественное число на экран, можно воспользоваться уже известной нам командой print(), например:

double d = 1.0 / 3;
System.out.print(d);

Получим:

0.3333333333333333

Такой вывод получается довольно громоздким. В java есть готовый инструмент для настраиваемого вывода числа. Этот инструмент называется форматирование.

Форматирование работает так: сначала указывается строка, в которой особым способом указывается, как именно должно быть отображено число, а потом само число, которое нужно отобразить.

Например, чтобы вывести число с точностью до трёх знаков после запятой, нужно выполнить команду

double d = 1.0 / 3;
System.out.printf("%.3f",d);

Получим:

0,333

Обратите внимание: мы использовали новую команду printf(), а не print(). Последняя буква f означает форматирование. Также у выведенного вместо точки ввыодится запятая.

Это происходит из-за того, что обозначение символа разделения зависит от языка. Если у компьютера задан русский язык системы, то символом разделения будет запятая ,, если английский - то ..

важно

У ситемы тестирования задан английский язык, поэтому в примерах будут даны числа через ., а вводить их на компьютере нужно используя ,.

Какое число стоит после точки в первом аргменте, столько символов после запятой будет выведено. Например, следующая команда выведет вещественное число d с точностью до одного знака после запятой.

double d = 1.0 / 3;
System.out.printf("%.1f",d);

получим:

0,3

В строку можно подставлять любое количество чисел, правда, нужно для каждого из них указать, куда именно вставлять его с помощью последовательности символов %.f. Для каждого числа количество цифр указывается отдельно.

double a = 1.0 / 9;
double b = 2.0 / 9;
double c = 4.0 / 9;
System.out.printf("%.4f %.3f %.2f", a, b, c);

Получим:

0,1111 0,222 0,44

Обратите внимание: для ввода вещественных костант необходимо использовать литерал вида: 1.0. Если не добавить .0, то java будет считать число целым, и будет выполнено целочисленное деление

double a = 1.0 / 9;
double b = 1 / 9;
System.out.printf("%.3f %.3f", a, b);

Получим:

0,111 0,000

Чтобы прочитать вещественное число, нужно использовать соответствующие команды сканера:

Scanner scanner = new Scanner(System.in);
double a = scanner.nextDouble();
float f = scanner.nextFloat();

Хотя вещественных типов данных два, мы будем работать только с double.

Чтобы преобразовать вещественное число в целое, т.е. взять целую часть, нужно использовать явное приведение типов. Чтобы сделать явное преобразование типов, нужно добавить в скобочках (тип) перед переменной:

   double a = 12.231;
int b = (int)a;
System.out.println(b);

Получим:

12

Для перевода целых чисел в вещественные не нужно явного преобразования, java выполняет такие преобразования автоматически, поэтому они называются неявными.

   int a = 100;
double b = a;
System.out.printf("%.3f", b);

Получим:

100,000

Однако если у нас есть целое число, а мы хотим разделить его как вещественное, нужно использовать явное приведение типов:

int a = 10;
double r = (double) a / 3;
System.out.println(a / 10);
System.out.printf("%.3f", r / 10);

Получим:

1
0,333

Так происходи тиз-за того, что java решает, какое деление нужно выполнить: целочисленное или вещественное по типам данных переменных. Если хотя бы одна переменная вещественная, то деление будет вещественным.

Математические действия


// вещественные операции Math
answ = Math.sqrt(a); // корень
answ = Math.tan(a); // тангенс
answ = Math.atan2(y,x); // арктангенс
answ = Math.sin(a); // синус
answ = Math.cos(a); // косинус
answ = Math.round(b); // округление
answ = Math.log(b); // логарифм
answ = Math.PI; // число Пи
answ = Math.pow(a,b); // возведение числа a в степень b

// операции, работающие и с целыми, и с вещественными числами

// целые числа
int a = 10;
int b = 15;

int c = Math.abs(a); // модуль
int d = Math.max(a, b); // большее из двух чисел
int e = Math.min(a, b); // меньшее из дух чисел

// вещественные числа
double af = 10.0;
double bf = 10.0;

double cf = Math.abs(af); // модуль
double df = Math.max(af, bf); // большее из двух чисел
double ef = Math.min(af, bf); // меньшее из дух чисел

Функция atan2() принимает в качестве аргументов координаты точки xx и yy, это позволяет получить угол наклона в диапазоне [π, π)[-\pi,~\pi), если использовать классическую функцию арктангенса atan(), то она принимает в качестве аргумента одно число, равное отношению yy координаты точки к xx координате.

Из-за этого обычный арктангенс atan() позволяет получить угол в диапазоне [π2, π2)[-\frac{\pi}{2},~\frac{\pi}{2}).

Формулы

Чтобы перевести число из радиан в градусы, используйте следующую формулу:

g=180πrg= \frac{180^{\circ}}{\pi}r

В обратную сторону:

r=π180gr = \frac{\pi}{180^{\circ}}g

Площадь треугольника по трём сторонам:

S=p(pa)(pb)(pc),S = \sqrt{p(p-a)(p-b)(p-c)},

где p=a+b+c2p=\frac{a+b+c}{2} - полупериметр треугольника

Площадь трапеции:

S=12(a+b)h,S = \frac{1}{2}(a+b)h,

где aa - меньшее основание трапеции, bb - большее, hh - высота

Объем куба

V=a3V = a^3

площадь его поверхности

S=6a2S = 6a^2

Объем прямоугольного параллелепипеда

V=abcV = abc

и площадь поверхности

S=2(ab+bc+ac)S = 2(ab + bc + ac)

Объём правильной пирамиды

V=13a2HV = \frac{1}{3}a^2H

и площадь поверхности

S=a(a+2h),S = a(a+2h),

где aa - сторона основания, HH - высота пирамиды, а hh - высота треугольника составляющего её боковые рёбра.

Формула для нахождения площади правильного nn-угольника через сторону:

S=na24tgπn,S = \frac{n a^ 2}{ 4 tg \frac{\pi}{n} },

где aa - сторона многоугольника, nn - число сторон многоугольника.

Прямая призма - призма, боковые ребра которой перпендикулярны основаниям. Её объём равен

V=SоснH,V = S_{осн}H,

где SоснS_{осн} - площадь её основания, HH - высота

Объём шара

V=43πR3,V = \frac{4}{3}\pi R^3,

где RR - радиус шара

Объём шарового сегмента (работает только при высоте, меньше радиуса)

V=πRh213πh3,V = \pi Rh^2-\frac{1}{3}\pi h^3,

где

RR - радиус шара, hh - высота шарового сегмента;

Задание

  1. Дана длина ребра куба aa. Найти объем куба и площадь его поверхности Ответ выведите с точностью до трёх знаков после запятой.
  2. Даны длины сторон прямоугольного параллелепипеда. Найти его объем и площадь поверхности. Ответ выведите с точностью до двух знаков после запятой.
  3. Треугольник задан своими сторонами. Найти периметр и площадь треугольника. Ответ выведите с точностью до четырёх знаков после запятой.
  4. Даны сторона основания правильной четырехугольной пирамиды, высота самой пирамиды и высота треугольника, составляющего боковые рёбра пирамиды. Найти её объём и площадь её поверхности. Ответ выведите с точностью до двух знаков после запятой.
  5. Даны основания и высота равнобедренной трапеции. Найти её площадь и периметр. Основания даны в произвольном порядке. Ответ выведите с точностью до трёх знаков после запятой.
  6. В основании призмы лежит правильный nn-угольник со стороной aa, требуется найти объём прямой призмы высоты hh. Ответ выведите с точностью до двух знаков после запятой.
  7. Дана сфера радиуса rr. Её разделили на две части секущей плоскостью, расстояние до которой от центра сферы равно dd. Требуется найти:
    • объём большей части
    • длину рёбер прямоугольного параллелепипеда, объёма равного объёму меньшей части, если известно, что они соотносятся как 1/2/3 Ответ выведите с точностью до трёх знаков после запятой.

Ссылка на контест