Как выбрать единицы(у) измерения
От: AlexanderDz  
Дата: 03.11.10 13:12
Оценка:
Всем привет!

Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.

Александр
Re: Как выбрать единицы(у) измерения
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 03.11.10 13:16
Оценка:
Минимальную? Тогда точно потерь не будет.
http://jvmmemory.com — простой способ настройки JVM
Re[2]: Как выбрать единицы(у) измерения
От: AlexanderDz  
Дата: 03.11.10 13:41
Оценка:
Здравствуйте, LeonidV, Вы писали:

LV>Минимальную? Тогда точно потерь не будет.


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

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

Александр
Re: Как выбрать единицы(у) измерения
От: Stanislav V. Zudin Россия  
Дата: 03.11.10 14:21
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.


Я бы использовал dbu = 0.01 ангстрема, а то и 0.001А. Хранил бы в int64. Размерности хватит для хранения метров. Можно было бы и в int32 ужаться, но предел — единицы мм, и dbu не получится сделать мельче 0.1А.
_____________________
С уважением,
Stanislav V. Zudin
Re[2]: Как выбрать единицы(у) измерения
От: AlexanderDz  
Дата: 03.11.10 14:28
Оценка:
Здравствуйте, Stanislav V. Zudin, Вы писали:

SVZ>Здравствуйте, AlexanderDz, Вы писали:


AD>>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.


SVZ>Я бы использовал dbu = 0.01 ангстрема, а то и 0.001А. Хранил бы в int64. Размерности хватит для хранения метров. Можно было бы и в int32 ужаться, но предел — единицы мм, и dbu не получится сделать мельче 0.1А.


Хранить величины с плавающей точкой в int32 или даже int64 чреваты другой головной болью — перед использованием стандартных функций таких как exp, sin, log и т.д величину необходимо преобразовать к вещественной. О чем, "простые смертные" конечно забудут или преобразуют неправильно.
Re: Как выбрать единицы(у) измерения
От: Аноним  
Дата: 03.11.10 14:43
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Всем привет!


AD>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.


AD>Александр


Может структурку создать с соответствующими методами преобразования и функциями. а то потом переделывать int на int * 10 будет стрёмно.
Re[3]: Как выбрать единицы(у) измерения
От: Stanislav V. Zudin Россия  
Дата: 03.11.10 14:43
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Хранить величины с плавающей точкой в int32 или даже int64 чреваты другой головной болью — перед использованием стандартных функций таких как exp, sin, log и т.д величину необходимо преобразовать к вещественной. О чем, "простые смертные" конечно забудут или преобразуют неправильно.


Мы в проекте использовали 1dbu = 0.1мкм. Координаты и размеры хранились в int32. Проблем не возникало.
Ну использование целочисленного деления вместо "честного" иногда попадалось, но и ловилось быстро.

Но проект был на нативном с++. Есть ли проблемы в преобразовании из целочисленного типа в double в .нет — увы, не знаю.
_____________________
С уважением,
Stanislav V. Zudin
Re[3]: Как выбрать единицы(у) измерения
От: LeonidV Ниоткуда http://vygovskiy.com
Дата: 03.11.10 18:24
Оценка:
AD>Здравствуйте, LeonidV, Вы писали:

LV>>Минимальную? Тогда точно потерь не будет.


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


Смотря как будете хранить данные. Если в double, то да. Если в тех же строках или списками — то нет. Наверняка есть библиотеки для точной арифметики и больших чисел. Типа BigDecimal из java.
http://jvmmemory.com — простой способ настройки JVM
Re: Как выбрать единицы(у) измерения
От: swame  
Дата: 04.11.10 07:49
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Всем привет!


AD>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.


AD>Александр


Конечно нано! Это же модная тема, не какие то там ангстремы.
Re: Как выбрать единицы(у) измерения
От: __kot2  
Дата: 04.11.10 10:03
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Всем привет!


AD>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.


AD>Александр

напишите свой тип с автонормированием и преобразованием, с ассертами и варнингами, дабы проблемы в одном месте не растекались по коду
Re[2]: Как выбрать единицы(у) измерения
От: AlexanderDz  
Дата: 04.11.10 10:11
Оценка:
Здравствуйте, __kot2, Вы писали:

__>Здравствуйте, AlexanderDz, Вы писали:


AD>>Всем привет!


AD>>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.


__>напишите свой тип с автонормированием и преобразованием, с ассертами и варнингами, дабы проблемы в одном месте не растекались по коду


Хм, похоже на изобретание велосипеда. Наверняка кто-то уже его изобрел. Например: http://www.codeproject.com/KB/library/Measurement_Conversion.aspx

Есть у кого-нибудь опыт с этой библиотекой?
Re[3]: Как выбрать единицы(у) измерения
От: __kot2  
Дата: 04.11.10 10:22
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Здравствуйте, __kot2, Вы писали:


__>>Здравствуйте, AlexanderDz, Вы писали:


AD>>>Всем привет!


AD>>>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.


__>>напишите свой тип с автонормированием и преобразованием, с ассертами и варнингами, дабы проблемы в одном месте не растекались по коду


AD>Хм, похоже на изобретание велосипеда. Наверняка кто-то уже его изобрел. Например: http://www.codeproject.com/KB/library/Measurement_Conversion.aspx

да там ерундовый код
тип например Number, внутри 3 представления — ангстремы, миллиметры и еще что-то — что вам нужно. создается от них по разному, чтобы не спутать. операции +-* — с учетом перенормировки
и нужно свою обертку над мат. библиотекой — чтобы не парить мозг, а давать ей Number и получать Number.
чтобы для 3 видов городить switch-case, то есть классическое решение — двойная диспетчеризация
Re[3]: Как выбрать единицы(у) измерения
От: __kot2  
Дата: 04.11.10 10:27
Оценка:
вы еще одну классическую ошибку не допускайте = главное интерфейс этого типа для себя продумайте, который вам нужен,
а не подстраивайтесь под уже имеющуюся штуку.
выберите интерфейс — написать-если не понравится взять готовую имплементацию — раз плюнуть
Re[3]: Как выбрать единицы(у) измерения
От: D14  
Дата: 04.11.10 21:11
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

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


AD>Кто-то где-то когда-то сказал (или написал) что следует выбирать так что бы основное количество вычислений происходило в величинах близких к единицам. Соответственно и должна выбираться единица измерения. Увы, не помню почему и не могу найти оригинальный документ


Если предполагается использовать арифметику с плавающей точкой, то масштаб входных данных не играет никакой роли. Ибо в этом заключается отличие от чисел с фиксированной точкой, что числа с плавающей точкой имеют опять же плавающую шкалу. Есть нюанс, что стандартная арифметика реализована двоичной, т.е. ад числами вида x*2^y, а т.к. многие десятичные числа могут быть записаны только бесконечной двоичной дробью, в финансах это может служить аргументом для отказа отказа от аппаратной двоичной реализации в пользу программной десятичной арифметики. В данной задаче не годится 32-битный формат float , т.к. содержит примерно 7 значащих десятичных знака, а раз данные могут отличаться в миллион раз, следует отдать предпочтение 64 (либо 80) битному формату double (содержащий примерно 16 значащих десятичных чисел).
Re: Как выбрать единицы(у) измерения
От: Undying Россия  
Дата: 05.11.10 11:07
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему.


А decimal чем не устраивает?
Re[4]: Как выбрать единицы(у) измерения
От: AlexanderDz  
Дата: 08.11.10 12:57
Оценка:
Здравствуйте, D14, Вы писали:

D14>Здравствуйте, AlexanderDz, Вы писали:


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


AD>>Кто-то где-то когда-то сказал (или написал) что следует выбирать так что бы основное количество вычислений происходило в величинах близких к единицам. Соответственно и должна выбираться единица измерения. Увы, не помню почему и не могу найти оригинальный документ


D14>Если предполагается использовать арифметику с плавающей точкой, то масштаб входных данных не играет никакой роли. Ибо в этом заключается отличие от чисел с фиксированной точкой, что числа с плавающей точкой имеют опять же плавающую шкалу. Есть нюанс, что стандартная арифметика реализована двоичной, т.е. ад числами вида x*2^y, а т.к. многие десятичные числа могут быть записаны только бесконечной двоичной дробью, в финансах это может служить аргументом для отказа отказа от аппаратной двоичной реализации в пользу программной десятичной арифметики. В данной задаче не годится 32-битный формат float , т.к. содержит примерно 7 значащих десятичных знака, а раз данные могут отличаться в миллион раз, следует отдать предпочтение 64 (либо 80) битному формату double (содержащий примерно 16 значащих десятичных чисел).


Спасибо. У нас нет необходимости использовать арифметику с фиксированной точкой. И ее "нюанс" хорошо известен.

Александр
Re: Как выбрать единицы(у) измерения
От: Alexander G Украина  
Дата: 25.11.10 13:14
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему.


Мне кажется, метры было бы удобно выбрать, тогда легче воспринимать, например 1.0e-8 как 10 нанометров.
Русский военный корабль идёт ко дну!
Re: Как выбрать единицы(у) измерения
От: Ikemefula Беларусь http://blogs.rsdn.org/ikemefula
Дата: 26.11.10 22:46
Оценка:
Здравствуйте, AlexanderDz, Вы писали:

AD>Моя контора начинаем новый проект на C# который активно работает величинами масштаба ангстремов (1.0e-10 метров), нанометры (1.0e-9 метров) и миллиметры (сами знаете). Что-бы избежать ошибок преобразования величин, хотелось бы выбрать одну основную единицу измерения. Вопрос: какую из величин выбрать и почему. Ссылочки были бы полезны.


Здесь стоит писать свой тип. Это может быть наприер Coordinate + Unit.

В некоторых ГИС используется именно такой подход и позволяют работать с величинами вроде длины экватора в милиметрах

Т.е. координата задает количество юнитов. Все это может преобразоываться куда попало и как попало.

Если лень думать, есть книга в которой пишется аналогичный класс, но для более других величин.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.