Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
1

Хотелось бы оптимизировать тип double под хранение величины углов

06.01.2015, 15:20. Показов 2511. Ответов 37
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
в принципе тема не такая уж и важная, так что если у кого-то есть важные и неотложные дела, пускай займётся ими.
Задача состоит вот в чем: тип double на мой взгляд плохо подходит под хранение величины углов,
значений он может принимать 2^32==4294967296, из них очень мало(по сравнению с 4294967296) в промежутке [0,pi),
вычисления не точные, в частности sin(0)!=sin(2*pi), в общем он мне не нравится и я думаю заменить его типом специально сделанным для хранения величины углов(пускай его будут звать angle). Все там будет как положено с битовыми полями(чтоб не один бит даром не пропал)...
Но всё таки хочется посоветоватся. у меня есть несколько идей:
1. так как у меня довольно узкий и фиксированный диапазон принимаемых значений то можно сделать число с фиксированной точкой, всё равно умножать angle на angle(самая трудная операция с числами с фиксированными точками) не придётся(это что за величина получится?).
2. в предыдущем примере есть свой недостаток - появляются значения в промежутке от 2*pi до максимального представимого значения. пример:
пускай под angle у меня выделяется 4 байта, тогда под целую часть я выделяю 4 бита а под дробную 28 бит
тогда 2*pi==1010.1000 0111 0000 1000 1000 0100 1101(если правильно посчитал)
но число 1111.1111 1111 1111 1111 1111 1111 1111 не входит в промежуток [0,pi)
я думаю что эту проблему можно решить числом 2пи обозначив максимальное представимое значение, тогда:
пи == 0000 0000 0000 0000 1111 1111 1111 1111;
прямой угол == 0000 0000 0000 0000 0000 0000 1111 1111;
3/4 окружности == 0000 0000 1111 1111 1111 1111 1111 1111;
но этот метод делает сложным преобразование из angle в тот же double, а так же вычисления всяких тригонометрических функций.

Добавлено через 4 минуты
в общем, хотелось бы услышать еще идей
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
06.01.2015, 15:20
Ответы с готовыми решениями:

Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double
Думаю из-за polp #include<iostream> #include<cmath> #include<cstdlib> using namespace std;...

Вычислить величины углов треугольника
Даны три положительных числа, если они могут быть длинами сторон разностороннего тупоугольного ...

Как узнать величины углов треугольника?
даны координаты 3 точек, необходимо узнать величины углов треугольника с этими вершинами, я знаю...

Найдите величины углов во вписанной окружности
Пусть I -центр вписанной окружности в треугольник ABC.Найдите величины углов AIB,BIC,AIC,если...

37
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
06.01.2015, 15:23 2
в двух словах можешь нормально проблему описать ?
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
06.01.2015, 15:27 3
Цитата Сообщение от Справлюсь Посмотреть сообщение
Тип double на мой взгляд плохо подходит под хранение величины углов,
значений он может принимать 2^32==4294967296
Double -- это 64-битовый вещественный тип, который может представлять числа в диапазоне примерно от 10^-308 до 10^308. Это в огромное число раз больше, чем количество атомов во вселенной. 2^32 -- это предел типа int, четырехбайтового целого.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.01.2015, 15:29 4
Справлюсь, То есть вы собираетесь создать класс Angle с методами sin, cos и операциями + - *(на скаляр) и т.д. Я правильно понял?
0
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
06.01.2015, 15:29  [ТС] 5
Dimension, в двух словах: как бы ты предложил сделать тип данных для хранения величины углов, чтоб вычисляло точней, а на бесчисленное хранение чисел больше двух пи не тратится.
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
06.01.2015, 15:29 6
Посмотрите на OpenGL, там вообще все координаты кодируются как числа с плавающей точкой в диапазоне от -1 до +1, и никаких проблем нет.
1
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
06.01.2015, 15:32  [ТС] 7
Цитата Сообщение от quwy Посмотреть сообщение
Double -- это 64-битовый вещественный тип, который может представлять числа в диапазоне примерно от 10^-308 до 10^308. Это в огромное число раз больше, чем количество атомов во вселенной. 2^32 -- это предел типа int, четырехбайтового целого.
извените 2^64.
а говорил я про количество принимаемых значений а не про диапозон
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
06.01.2015, 15:33 8
Справлюсь, числа с плавающей точкой на то и с плавающей, что в них дробная часть может вытеснять целую (или наоборот). Числа от 0 до 2*pi будут использовать всю точность типа, потому что почти все биты будут использованы для хранения дробной части числа. Точно так же и число pi*10^10 будет использовать всю доступную разрядность, но количество знаков после точки при этом будет намного ниже, чем при хранении 2*pi потому что значительная часть битов будет утилизирована целой частью большого числа..
0
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
06.01.2015, 15:34  [ТС] 9
Цитата Сообщение от Байт Посмотреть сообщение
Справлюсь, То есть вы собираетесь создать класс Angle с методами sin, cos и операциями + - *(на скаляр) и т.д. Я правильно понял?
да.
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
06.01.2015, 15:36 10
Вдобавок к quwy:
Цитата Сообщение от Справлюсь Посмотреть сообщение
умножать angle на angle(самая трудная операция с числами с фиксированными точками) не придётся(это что за величина получится?)
Когда перейдете в старшие классы, узнаете о рядах Тэйлора и методе вычисления тригонометрических функций (синусы там всякие, хотя может вы их тоже не проходили еще, они вроде в 8 классе начинаются) через них, тогда поймете зачем умножать углы.
0
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
06.01.2015, 15:38  [ТС] 11
Цитата Сообщение от quwy Посмотреть сообщение
Справлюсь, числа с плавающей точкой на то и с плавающей, что в них дробная часть может вытеснять целую (или наоборот). Числа от 0 до 2*pi будут использовать всю точность типа, потому что почти все биты будут использованы для хранения дробной части числа. Точно так же и число pi*10^10 будет использовать всю доступную разрядность, но количество знаков после точки при этом будет намного ниже, чем при хранении 2*pi потому что значительная часть битов будет утилизирована целой частью большого числа..
я это понимаю, поэтому и хочу чего ни будь более подходящего для этой ситуации(очень часто приходится иметь дело).
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
06.01.2015, 15:43 12
Цитата Сообщение от Справлюсь Посмотреть сообщение
я это понимаю, поэтому и хочу чего ни будь более подходящего для этой ситуации(очень часто приходится иметь дело).
Так что вас не устраивает, если понимаете? Тип double может хранить числа с единицами целых разрядов и сотнями дробных. А может хранить числа с сонями целых разрядов и единицами дробных. Десятичная точка у него плывет туда, куда того требует максимально точное представление числа. Первый случай полностью покрывает ваши потребности без какой-либо избыточности в потреблении памяти.
0
3257 / 2059 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
06.01.2015, 15:46 13
Цитата Сообщение от Справлюсь Посмотреть сообщение
чтоб вычисляло точней
Начнем с того, что Пи — иррациональное число.
0
Модератор
5047 / 3276 / 526
Регистрация: 01.06.2013
Сообщений: 6,806
Записей в блоге: 9
06.01.2015, 15:48 14
Цитата Сообщение от Справлюсь Посмотреть сообщение
пускай под angle у меня выделяется 4 байта, тогда под целую часть я выделяю 4 бита а под дробную 28 бит
что за приложения такие Вы делаете, что Вам углы такой точности понадобились?
0
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
06.01.2015, 15:50 15
если тебе double не хватает то используй длинную арифметику ,только не понятно зачем прям такая точность

Добавлено через 1 минуту
KolodeznyDiver, ракеты небось запускает ,сегодня от SpaceX не полетела ,видать расчеты не точные были,вот заставили заного считать )
0
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
06.01.2015, 15:51  [ТС] 16
_Ivana,
Цитата Сообщение от _Ivana Посмотреть сообщение
Когда перейдете в старшие классы, узнаете о рядах Тэйлора и методе вычисления тригонометрических функций (синусы там всякие, хотя может вы их тоже не проходили еще, они вроде в 8 классе начинаются) через них, тогда поймете зачем умножать углы.
а чо, по мне видно шо я в 7 учусь???
0
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
06.01.2015, 15:55 17
Цитата Сообщение от Справлюсь Посмотреть сообщение
вычисления не точные, в частности sin(0)!=sin(2*pi), в общем он мне не нравится и я думаю заменить его типом специально сделанным для хранения величины углов
а их никак и не получится сделать абсолютно точными. действительных чисел в промежутке [0, 1] бесконечно много, а любой тип данных в компьютере может принимать конечное кол-во значений. всякие ваши манипуляции с битами могут увеличить точность чисел ну в 2, в 3, в 4 и т.д. раз, но никак не до абсолютной точности.
Попробуйте ввести эпсилон для задания точности при сравнении чисел. Или если точность является критическим фактором, то надо искать решение с другой стороны (зависит от задачи).
Может сформулируете конкретную задачу чтобы помощь была более конкретной?
0
_Ivana
06.01.2015, 15:55
  #18

Не по теме:

Манера разговора, орфографические ошибки, незнание элементарных вещей из математики и т.д. создают общее впечатление ученика 6-7 класса.

0
833 / 641 / 101
Регистрация: 20.08.2013
Сообщений: 2,524
06.01.2015, 17:12 19
Цитата Сообщение от Справлюсь Посмотреть сообщение
значений он может принимать ..., из них очень мало ... в промежутке [0,pi)
2^64 и значительно больше 2^53. Не так уж там много лишнего.

Цитата Сообщение от Справлюсь Посмотреть сообщение
в частности sin(0)!=sin(2*pi)
Ну так храни коэффициент при pi, а не сам угол.
0
Диссидент
Эксперт C
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
06.01.2015, 17:21 20
Цитата Сообщение от Справлюсь Посмотреть сообщение
да.
Если у вас что-то получится - дайте знать.
Цитата Сообщение от ya_noob Посмотреть сообщение
их никак и не получится сделать абсолютно точными.
Цитата Сообщение от Справлюсь Посмотреть сообщение
чтоб вычисляло точней
Чувствуете разницу?
ИМХО, проблема в том, что
Цитата Сообщение от Справлюсь Посмотреть сообщение
sin(0)!=sin(2*pi)
И если эту проблему удастся решить, это будет интересно...

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
Манера разговора, орфографические ошибки, незнание элементарных вещей из математики и т.д. создают общее впечатление ...
Ой, а стой ли ноги сегодня встали:D

0
06.01.2015, 17:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.01.2015, 17:21
Помогаю со студенческими работами здесь

Цикл for и тип double. Переменная округляется, хотя объявлена как Double
using System; class zada4ka_5_32 { static void Main() { int n; ...

найти длины сторон и величины углов треугольника
найти длины сторон и величины углов треугольника с вершинами A(-1;-2;4) B(-4;-2;0) C(3;-2;1)

Даны 3 числа,которые задают величины углов треугольника
Даны 3 числа,которые задают величины углов треугольника.Узнать,можно ли построить треугольник по...

Вычислить длину гипотенузы c и величины двух углов треугольника
Здравствуйте! Помогите пожалуйста - Заданы длины двух катетов прямоугольного треугольника a, b....

Вычислить площадь S, периметр P и величины углов α, β и γ треугольника по заданным длинам сторон.
Известны длины сторон треугольника a, b и с. Вычислить площадь S, периметр P и величины углов α, β...

По введённым координатам вершин вычислить величины его углов, периметр и площадь.
По введенным координатам вершин треугольника вычислить величины его углов(в градусах), периметр и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru