Минутка WTF-21: Как в аптеке
От: Sinix  
Дата: 13.11.17 13:47
Оценка: 21 (4)
Как обычно
Автор: Sinix
Дата: 06.11.17
:
public static TimeSpan GetScaledTime(this TimeSpan value, double multiplier) =>
    TimeSpan.FromMilliseconds(value.TotalMilliseconds * multiplier);

Ну и где тут можно ошибиться?
минутка wtf
Re: Переполнения
От: Qbit86 Кипр
Дата: 13.11.17 14:02
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Ну и где тут можно ошибиться?:)


Может, что-нибудь с переполнениями/НаНами/эпсилонами?
TimeSpan t = TimeSpan.MaxValue.GetScaledTime(Double.MinValue);
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Переполнения
От: Sinix  
Дата: 13.11.17 14:03
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Может, что-нибудь с переполнениями/НаНами/эпсилонами?

Неа, это слишком просто было бы.
И чтоб два раза не вставать — проблема не в перфомансе.
Re: Минутка WTF-21: Как в аптеке
От: Слава  
Дата: 13.11.17 14:04
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Как обычно
Автор: Sinix
Дата: 06.11.17
:

S>
S>public static TimeSpan GetScaledTime(this TimeSpan value, double multiplier) =>
S>    TimeSpan.FromMilliseconds(value.TotalMilliseconds * multiplier);
S>

S>Ну и где тут можно ошибиться?

double при больших значениях плывёт. Потому что плавучка же. Я так на счетчике миллилитров топлива нарвался — у меня был унаследованный проект, работающий с топливораздаточным контроллером, и он замечательно работал в офисе. А на реальной АЗС начались чудеса — счетчики топлива там имели большие значения, потому что контроллер уже проработал пару лет. И в результате в отчётах постоянно возникал этакий "дребезг" — в после каждого налива значение то чуть выше ожидаемого, то чуть ниже. Исправилось переделкой на decimal и в коде, и в базе.

А вообще тут идеально подошли бы числа с фиксированной точкой и заданной точностью как в Ada (а больше такого нигде и нет, насколько мне известно):
type Volts is delta 2.0**(-12) range 0.0 .. 5.0;

Где delta — это шаг между точными значениями.
Re: Минутка WTF-21: Как в аптеке
От: vasmann  
Дата: 13.11.17 14:06
Оценка:
Здравствуйте, Sinix, Вы писали:

S>Как обычно
Автор: Sinix
Дата: 06.11.17
:

S>
S>public static TimeSpan GetScaledTime(this TimeSpan value, double multiplier) =>
S>    TimeSpan.FromMilliseconds(value.TotalMilliseconds * multiplier);
S>

S>Ну и где тут можно ошибиться?

Timespan под собой на тиках всё считает.
А в миллисекунды и прочую чепуху уже конвертирует.
Логично было бы брать тики, множить их и из тиков формировтаь
Re[2]: Минутка WTF-21: Как в аптеке
От: Sinix  
Дата: 13.11.17 14:17
Оценка:
Здравствуйте, Слава, Вы писали:

S>>Ну и где тут можно ошибиться?

С>double при больших значениях плывёт.
Близко, но не совсем. Хинт: проблема не в больших значениях.
Re[2]: Минутка WTF-21: Как в аптеке
От: Sinix  
Дата: 13.11.17 14:18
Оценка:
Здравствуйте, vasmann, Вы писали:

V>Timespan под собой на тиках всё считает.

V>А в миллисекунды и прочую чепуху уже конвертирует.

Почти-почти правильно. Хинт: проблема не в больших значениях.
Re[3]: Минутка WTF-21: Как в аптеке
От: ksg71 Германия  
Дата: 13.11.17 14:20
Оценка: 100 (4) +2
Здравствуйте, Sinix, Вы писали:

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


S>>>Ну и где тут можно ошибиться?

С>>double при больших значениях плывёт.
S>Близко, но не совсем. Хинт: проблема не в больших значениях.

TimeSpan test = TimeSpan.FromMilliseconds(0.5);
double ms = test.TotalMilliseconds; // Returns 0

тики long, милисекунды double — внутри при приведении округление

здесь
Das Reich der Freiheit beginnt da, wo die Arbeit aufhört. (c) Karl Marx
Re: Минутка WTF-21: Как в аптеке
От: hardcase Пират http://nemerle.org
Дата: 13.11.17 14:28
Оценка: 68 (3) +1
Здравствуйте, Sinix, Вы писали:

S>Ну и где тут можно ошибиться?


В округлении миллсекунд до тактов, когда полмиллисекунды превратятся в ноль тактов.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Минутка WTF-21: Как в аптеке
От: Sinix  
Дата: 13.11.17 14:29
Оценка:
Здравствуйте, ksg71, Вы писали:

K>здесь


Тёмное наследие первого фреймворка, от которого фиг избавишься. Историю попыток можно глянуть тут:
https://github.com/dotnet/coreclr/pull/10352#issuecomment-289069736
Re[2]: Минутка WTF-21: Как в аптеке
От: vasmann  
Дата: 13.11.17 14:32
Оценка:
Здравствуйте, hardcase, Вы писали:

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


S>>Ну и где тут можно ошибиться?


H>В округлении миллсекунд до тактов, когда полмиллисекунды превратятся в ноль тактов.


Согласно кода: https://referencesource.microsoft.com/#mscorlib/system/timespan.cs,a719193f6f6b1015
Они добавляют пол секунды в случае если миллисекунды не равны нулю. Таким образом одна секунда минимум будет. Хотя да, ожидалось пол.
Re[3]: Минутка WTF-21: Как в аптеке
От: vasmann  
Дата: 13.11.17 14:37
Оценка:
Здравствуйте, vasmann, Вы писали:

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


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


S>>>Ну и где тут можно ошибиться?


H>>В округлении миллсекунд до тактов, когда полмиллисекунды превратятся в ноль тактов.


V>Согласно кода: https://referencesource.microsoft.com/#mscorlib/system/timespan.cs,a719193f6f6b1015

V>Они добавляют пол секунды в случае если миллисекунды не равны нулю. Таким образом одна секунда минимум будет. Хотя да, ожидалось пол.

Там где я говорил секунда — имелась ввиду миллисекунда
Re[3]: Минутка WTF-21: Как в аптеке
От: Sinix  
Дата: 13.11.17 16:04
Оценка:
Здравствуйте, vasmann, Вы писали:

V>Таким образом одна (милли)секунда минимум будет. Хотя да, ожидалось пол.

Неа. Там away from zero округление
https://dotnetfiddle.net/iIpgqe
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.