Показать сообщение отдельно
  #15  
Старый 26.09.2012, 03:00
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от Dmitry_DM
Ну почему же Sample не участвует в вычислениях?
Где я писал что Sample не участвует в вычислениях? Я писал что в вычислениях не участвуют сэмплы из wav-файла.
Цитата:
Сообщение от Dmitry_DM
Ведь именно это число самое главное, к тому же подтверждением этих сэмплов есть вывод их в txt. Они там благополучно присутствуют.
Я и не писал что в выводе в файл они не участвуют. Но после вывода в файл идут вычисления, и вот в вычислениях они уже не участвуют.
Цитата:
Сообщение от Dmitry_DM
На счет инициализации s: Что, просто поставить в начале всего процесса S:=0; ?
Можно в начале процесса, но лучше сразу перед подсчётом суммы, т.е. так как это сделано для переменной S2.
Цитата:
Сообщение от Dmitry_DM
И еще: почему мы заменяем
Код:
s:=s+Sample;
на это?
Код:
s := s + (NumSamples + 1) * NumSamples div 2;
Нет, нет. Я не писал что нужно заменить одну строчку на другую. Заменять нужно весь цикл на ту строчку. Т.е. заменить это:
Код:
for Sample := 1 to NumSamples do
  begin
    s:=s+Sample;
  end;
на это:
Код:
s := s + (NumSamples + 1) * NumSamples div 2;
И если переменная S должна быть проинициализирована нулём, то строчку S:=0; в твоём случае нужно поставить сразу перед циклом, а в моём случае упростить заменяющую строчку на такую:
Код:
s := (NumSamples + 1) * NumSamples div 2;
Цитата:
Сообщение от Dmitry_DM
Кстати я попробовал на своем файле ваш и мой коды и результаты отличаются.
Да, я там забыл квадратный корень из M1. В программе во время теста исправил, а при отправке на форум исправить забыл
Смотри во вложении тестовый пример. Там левая кнопка выводит в левый Memo результат работы твоего кода, а правая кнопка выводит в правый Memo результат работы моего кода. Результаты не должны отличаться. Для вычислений открывать wav-файл не нужно, достаточно ввести в поле ввода значение NumSamples (количество сэмплов), которые ты можешь получить открыв wav-файл в своей программе, ну и заодно убедиться, что результаты работы в твоей программе и в этом тестовом примере не отличаются и не зависят от самого wav-файла.
И ещё обрати внимание, что у тебя там происходит переполнение: если сложить все числа от 1 до 398592 (т.е. 1+2+3+...+398591+398592), то должно получиться огромное число 79437990528, а у тебя показывает всего лишь:
Цитата:
Сообщение от Dmitry_DM
Код:
S: 2128579200
...
Явное переполнение (18 раз). Это всё потому что максимальное число которое можно записать в переменную типа LongWord равно 4294967295. Чтобы не было переполнения нужно использовать более вместительные типы Int64 или Extended.
Цитата:
Сообщение от Dmitry_DM
И как будет правильно я не знаю, что вы посоветуете?
Ну, по моему, это и так понятно - нужно чтобы в вычислении участвовали также и сэмплы из wav-файла, а не только NumSamples.
Вложения
Тип файла: 7z CalcNumSamples.7z (1.9 Кбайт, 4 просмотров)
Ответить с цитированием