76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
|
|
1 | |
Хотелось бы оптимизировать тип double под хранение величины углов06.01.2015, 15:20. Показов 2511. Ответов 37
Метки нет (Все метки)
в принципе тема не такая уж и важная, так что если у кого-то есть важные и неотложные дела, пускай займётся ими.
Задача состоит вот в чем: тип 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
|
06.01.2015, 15:20 | |
Ответы с готовыми решениями:
37
Ошибки error C2296: -: недопустимо, левый операнд имеет тип "double (__cdecl *)(double,double,double Вычислить величины углов треугольника Как узнать величины углов треугольника? Найдите величины углов во вписанной окружности |
Dimension
594 / 462 / 223
Регистрация: 08.04.2014
Сообщений: 1,710
|
|
06.01.2015, 15:23 | 2 |
в двух словах можешь нормально проблему описать ?
0
|
Native x86
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
|
|
06.01.2015, 15:27 | 3 |
Double -- это 64-битовый вещественный тип, который может представлять числа в диапазоне примерно от 10^-308 до 10^308. Это в огромное число раз больше, чем количество атомов во вселенной. 2^32 -- это предел типа int, четырехбайтового целого.
0
|
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
|
|
06.01.2015, 15:29 [ТС] | 5 |
Dimension, в двух словах: как бы ты предложил сделать тип данных для хранения величины углов, чтоб вычисляло точней, а на бесчисленное хранение чисел больше двух пи не тратится.
0
|
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
|
|
06.01.2015, 15:32 [ТС] | 7 |
0
|
Native x86
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 |
0
|
06.01.2015, 15:36 | 10 |
Вдобавок к quwy:
Когда перейдете в старшие классы, узнаете о рядах Тэйлора и методе вычисления тригонометрических функций (синусы там всякие, хотя может вы их тоже не проходили еще, они вроде в 8 классе начинаются) через них, тогда поймете зачем умножать углы.
0
|
76 / 36 / 17
Регистрация: 24.07.2014
Сообщений: 357
|
|
06.01.2015, 15:38 [ТС] | 11 |
я это понимаю, поэтому и хочу чего ни будь более подходящего для этой ситуации(очень часто приходится иметь дело).
0
|
Native x86
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
|
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 |
0
|
_
317 / 151 / 27
Регистрация: 08.10.2011
Сообщений: 432
|
|
06.01.2015, 15:55 | 17 |
а их никак и не получится сделать абсолютно точными. действительных чисел в промежутке [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 |
2^64 и значительно больше 2^53. Не так уж там много лишнего.
Ну так храни коэффициент при pi, а не сам угол.
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|
06.01.2015, 17:21 | 20 |
Если у вас что-то получится - дайте знать.
Чувствуете разницу?
ИМХО, проблема в том, что И если эту проблему удастся решить, это будет интересно...
0
|
06.01.2015, 17:21 | |
06.01.2015, 17:21 | |
Помогаю со студенческими работами здесь
20
Цикл for и тип double. Переменная округляется, хотя объявлена как Double найти длины сторон и величины углов треугольника Даны 3 числа,которые задают величины углов треугольника Вычислить длину гипотенузы c и величины двух углов треугольника Вычислить площадь S, периметр P и величины углов α, β и γ треугольника по заданным длинам сторон. По введённым координатам вершин вычислить величины его углов, периметр и площадь. Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |