Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[44.200.230.43] |
|
Сообщ.
#1
,
|
|
|
Простой код:
Dim t As Single t = Timer Caption = Timer - t Почему он возвращает отрицательные значения? Если просто в цикле проверять возвращаемое значение Timer, оно никогда не убывает. Я начал сомневаться, что Timer возвращает тип Single, и это ошибки округления, но, во-первых, почему ошибка всегда отрицательная? Во-вторых, из справки: Цитата Возвращает значение типа Single, представляющее количество секунд, прошедших после полночи. В-третьих, такой код работает аналогично: Dim t As Single CopyMemory t, Timer, 4 Caption = Timer - t С помощью CopyMemory я убедился, что возвращаемое значение именно в формате Single. Однако такой код, почему-то ведёт себя правильно (возвращает нули, теоретически иногда должен вернуть положительное число): Dim t As Single t = Timer Caption = CSng(Timer) - t |
Сообщ.
#2
,
|
|
|
Dim i As Integer, ds As Single, td As Double For i = 1 To 20 ts = Timer td = Timer Debug.Print i, Timer, ts, td Next Добавлено И ещё Const cnt As Integer = 10000 Dim i As Integer, t(cnt) As Double For i = 0 To cnt t(i) = Timer Next Debug.Print 0, t(0) For i = 1 To cnt If t(i) <> t(i - 1) Then Debug.Print i, t(i) Next |
Сообщ.
#3
,
|
|
|
И что? Я же уже написал:
Цитата Mikle @ Если просто в цикле проверять возвращаемое значение Timer, оно никогда не убывает. Откуда берётся отрицательная разница? Каким образом CSng(Timer) устраняет это? |
Сообщ.
#4
,
|
|
|
Mikle
Запустил? результаты посмотрел? цифирки посчитал? да даже элементарного ? timer, csng(timer), cdbl(timer), ccur(timer) уже достаточно, чтобы понять, что timer возвращает пусть и не double, но всё-таки немножко больше, чем single... |
Сообщ.
#5
,
|
|
|
На вбстритс написал почему так - из-за округления.
Добавлено Цитата Akina @ уже достаточно, чтобы понять, что timer возвращает пусть и не double, но всё-таки немножко больше, чем single... Значение с плавающей точкой возвращается на вершине стека FPU, а оно всегда в 80-битовом формате. |
Сообщ.
#6
,
|
|
|
Цитата Akina @ уже достаточно, чтобы понять, что timer возвращает пусть и не double, но всё-таки немножко больше, чем single... Нет. Это так приводится Single к Double, попробуй так: Debug.Print Timer, CDbl(CSng(Timer)), CDbl(Timer) Цитата TheTrik @ Значение с плавающей точкой возвращается на вершине стека FPU, а оно всегда в 80-битовом формате. Это не объясняет работу CopyMemory. |
Сообщ.
#7
,
|
|
|
Цитата Mikle @ Это не объясняет работу CopyMemory. В CopyMemory ты сохраняешь переменную в какую-либо ячейку памяти, а не работаешь со стеком. |
Сообщ.
#8
,
|
|
|
Цитата Mikle @ Это так приводится Single к Double, попробуй так Я вообще плохо понимаю, что и как приводится, если вообще приводится: ? CSng(58034.3671875) 58034,37 ? CDbl(58034.37) 58034,37 ? CDbl(CSng(58034.3671875)) 58034,3671875 Вот как? |