На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual Basic: Общие вопросы
Здесь обсуждаются вопросы по языку Visual Basic 1-6 (а так же по схожим языкам, как, например, PowerBASIC).
Вопросы по Visual Basic .NET (это который входит в состав Visual Studio 2002/2003/2005/2008+, для тех, кто не в курсе) обсуждаются в разделе .NET.

Обратите внимание:
1. Прежде чем начать новую тему или отправить сообщение, убедитесь, что Вы не нарушаете правил форума!
2. Обязательно воспользуйтесь поиском. Возможно, Ваш вопрос уже обсуждали. Полезные ссылки приведены ниже.
3. Темы с просьбой выполнить какую-либо работу за автора в этом разделе не обсуждаются. Студенты, вам сюда: ПОМОЩЬ СТУДЕНТАМ!
4. Используйте теги [ code=vba ] ...текст программы... [ /code ] для выделения текста программы подсветкой.
5. Помните, здесь телепатов нет. Формулируйте свой вопрос максимально грамотно и чётко: Как правильно задавать вопросы
6. Запрещено отвечать в темы месячной (и более) давности, без веских на то причин.

Полезные ссылки:
user posted image FAQ Сайта user posted image FAQ Раздела user posted image Кладовка user posted image Наши Исходники user posted image API-Guide user posted image Поиск по Разделу user posted image MSDN Library Online user posted image Google

Ваше мнение о модераторах: user posted image SCINER, user posted image B.V.
Модераторы: SCINER, B.V.
  
> Странное поведение ф-ции Timer
    Простой код:
    ExpandedWrap disabled
        Dim t As Single
       
        t = Timer
        Caption = Timer - t

    Почему он возвращает отрицательные значения?
    Если просто в цикле проверять возвращаемое значение Timer, оно никогда не убывает.
    Я начал сомневаться, что Timer возвращает тип Single, и это ошибки округления, но, во-первых, почему ошибка всегда отрицательная? Во-вторых, из справки:
    Цитата
    Возвращает значение типа Single, представляющее количество секунд, прошедших после полночи.

    В-третьих, такой код работает аналогично:
    ExpandedWrap disabled
        Dim t As Single
       
        CopyMemory t, Timer, 4
        Caption = Timer - t

    С помощью CopyMemory я убедился, что возвращаемое значение именно в формате Single.
    Однако такой код, почему-то ведёт себя правильно (возвращает нули, теоретически иногда должен вернуть положительное число):
    ExpandedWrap disabled
        Dim t As Single
       
        t = Timer
        Caption = CSng(Timer) - t
      ExpandedWrap disabled
        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


      Добавлено
      И ещё
      ExpandedWrap disabled
        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
        И что? Я же уже написал:
        Цитата Mikle @
        Если просто в цикле проверять возвращаемое значение Timer, оно никогда не убывает.

        Откуда берётся отрицательная разница? Каким образом CSng(Timer) устраняет это?
          Mikle
          Запустил? результаты посмотрел? цифирки посчитал? да даже элементарного
          ExpandedWrap disabled
            ? timer, csng(timer), cdbl(timer), ccur(timer)

          уже достаточно, чтобы понять, что timer возвращает пусть и не double, но всё-таки немножко больше, чем single...
          Сообщение отредактировано: Akina -
            На вбстритс написал почему так - из-за округления.

            Добавлено
            Цитата Akina @
            уже достаточно, чтобы понять, что timer возвращает пусть и не double, но всё-таки немножко больше, чем single...

            Значение с плавающей точкой возвращается на вершине стека FPU, а оно всегда в 80-битовом формате.
              Цитата Akina @
              уже достаточно, чтобы понять, что timer возвращает пусть и не double, но всё-таки немножко больше, чем single...

              Нет. Это так приводится Single к Double, попробуй так:
              ExpandedWrap disabled
                Debug.Print Timer, CDbl(CSng(Timer)), CDbl(Timer)


              Цитата TheTrik @
              Значение с плавающей точкой возвращается на вершине стека FPU, а оно всегда в 80-битовом формате.

              Это не объясняет работу CopyMemory.
              Сообщение отредактировано: Mikle -
                Цитата Mikle @
                Это не объясняет работу CopyMemory.

                В CopyMemory ты сохраняешь переменную в какую-либо ячейку памяти, а не работаешь со стеком.
                  Цитата Mikle @
                  Это так приводится Single к Double, попробуй так

                  Я вообще плохо понимаю, что и как приводится, если вообще приводится:
                  ExpandedWrap disabled
                    ? CSng(58034.3671875)
                     58034,37
                     
                    ? CDbl(58034.37)
                     58034,37
                     
                    ? CDbl(CSng(58034.3671875))
                     58034,3671875

                  Вот как?
                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                  0 пользователей:


                  Рейтинг@Mail.ru
                  [ Script execution time: 0,0476 ]   [ 17 queries used ]   [ Generated: 28.03.24, 09:01 GMT ]