Рассчитать значение функции с использованием циклов while или do while

Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain

Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

02 ноя 2017, 14:36

Не понял Ваш комментарий, если честно. Вы уж извините, но по-моему он бессмысленный. Тот способ который показал я уже используется давно и в частности использовался мной лично. Вынести расчет ряда в функцию и никаких переменных там больше городить не надо. :D
Еще можно вот так, но так будет больше ресурсов процессора потребляться, по-моему:
Sign *= -1; //это пишется в цикле while() сразу после расчета члена ряда
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

02 ноя 2017, 15:21

Слива писал(а):Не понял Ваш комментарий, если честно. Вы уж извините, но по-моему он бессмысленный.
Переменные должны быть ортогональны друг другу. Счетчик цикла и индикатор четности не ортогональны. При этом вы предлагаете их считать отдельно друг от друга.
Слива писал(а): Тот способ который показал я уже используется давно и в частности использовался мной лично.
Ну да, первый признак пионерского кода - по одной переменной на каждый чих.
Слива писал(а): Еще можно вот так, но так будет больше ресурсов процессора потребляться, по-моему:
У всех компиляторов есть возможность генерации ассемблерных листингов вдобавок к *.obj/*.exe. Если у вас есть идея о том во что превращается код на С++, то при желании это можно легко проверить.

BTW, я что-то не подумал o pow(-1., n), так будет строго по математическому определению.
2B OR NOT(2B) = FF
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

03 ноя 2017, 13:25

В принципе, Вы правы, но какая разница как их считать. В обоих случаях целостность данных сохранится. Т.е. в первом случае, как у автора:
((n%2)*2 - 1) //Тут будет целостность данных и все будет правильно
В моем случае:
Sign = -Sign;
Sign *= -1; //Тут тоже будет целостность данных и все будет правильно :)
Знаки чередуются, никакого индикатора четности не надо - они чередуются, как я уже сказал - это стабильный и четкий процесс, не нужно бочку катить на это - там все такое в компьютере.
Без глюков, правда, никуда. Но это уже отдельная тема для разговора. Здесь же все будет работать стабильно и хорошо. :)
"Ну да, первый признак пионерского кода - по одной переменной на каждый чих." - на cyberforum.ru сходите, это оттуда я взял эту идею, не такие уж они и тупые люди. Придется расколоться. :)
В чем код-то пионерский? По 1 варианту процессор будет каждый раз делить и напрягаться - не рационально. Вот этот код как раз и есть пионерский. А мой код лучше - он как бы оптимизирован. :)
Просто делаешь число отрицательным и все. Ничего считать вообще не надо. Понятно?
"BTW, я что-то не подумал o pow(-1., n), так будет строго по математическому определению." - а это еще зачем? "-" можно вынести легко и делается это по школьным правилам математики. Строго это или не строго - пофиг на это. :)
Я уже, если честно, устал от Ваших комментариев по этой теме. Какая разница как считать минус или плюс там получается в общем члене. В любом случае процессоры сейчас мощные и они легко все почситают. Я предпочитаю свой способ вычисления минуса, каждый предпочитает свой. Я думаю не нужно этому вопросу уделять столько внимания, он(автор) как хочет так и сделает.
Тем более для учебных целей там вообще не обсуждается насколько загружен процессор. Это только у профессионалов обсуждается - высоком уровне и не для учебных целей, а для военных и других ресурсоемких приложений(графика, например).
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

03 ноя 2017, 13:51

Слива писал(а):В чем код-то пионерский? По 1 варианту процессор будет каждый раз делить и напрягаться - не рационально.

Там деление происходит на константу, причем на хорошую константу. Смысла использовать DIV нет никакого, можно использовать SHR.
2B OR NOT(2B) = FF
alexboliam
Сообщения: 5
Зарегистрирован: 16 окт 2017, 01:05

03 ноя 2017, 23:42

Absurd писал(а):Там деление происходит на константу, причем на хорошую константу. Смысла использовать DIV нет никакого, можно использовать SHR.
Спасибо Вам большое за помощь! Во всем разобрался и написал в тот день программу (код ниже, если интересно хоть чуть-чуть).

Код: Выделить всё

 
#include "stdafx.h"
#include <iostream>
using namespace std;


int main()
{
	setlocale(LC_ALL, "Russian");
	int n = 1;
	double ln = 0;
	double a;
	cout << "Введите число a в промежутке от 0 до 2 :" << endl;
	cin >> a;
	double next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
b
	if (a >= 0 && a <= 2) {

		while (abs(next) > 0.000001)
		{
			n++;
			ln += next;
			next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);

		}

		printf("Ln:\n%.6f\n", ln);
	}
	esle {
		cout << "Введенное число больше 2 или меньше 0"
	}
	system("pause");
}
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

04 ноя 2017, 03:53

alexboliam писал(а):Спасибо Вам большое за помощь! Во всем разобрался и написал в тот день программу (код ниже, если интересно хоть чуть-чуть).

Код: Выделить всё

 
double next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
...
while (abs(next) > 0.000001) {
...
  n++;
  ln += next;
  next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
}

Есть программистское правило - Do not repeat yourself. По русски - "нельзя повторять один и тот же код".
Я так понимаю, в твоем коде расчет next дублирован чтобы while выполнился в первый раз. Но если нужно выполнить цикл как минимум один раз с проверкой в конце, то тут do...while более очевиден.

Код: Выделить всё

 
int n = 0; // <- Это важно
double next;
do {
  n++;
  next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);
  ln += next;
} while (abs(next) > 0.000001);
2B OR NOT(2B) = FF
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

04 ноя 2017, 06:04

Absurd писал(а):Там деление происходит на константу, причем на хорошую константу. Смысла использовать DIV нет никакого, можно использовать SHR.
- кстати, да, просто там будет сдвиг на 2 вправо(не гарантия, но большая вероятность) и тот бит, который выдвинуля и будет результат. Ресурсов проца мало, да. Но DIV никто не использует: ни я, ни автор.
Цитата кода:
while(abs(next) > 0.000001)
Неправильно пишете. 2 за кодинг. Я же показал, как надо писать:
while(fabs(next) > 1E-6)
Absurd
Сообщения: 1213
Зарегистрирован: 26 фев 2004, 13:24
Откуда: Pietari, Venäjä
Контактная информация:

04 ноя 2017, 10:05

Слива писал(а):- кстати, да, просто там будет сдвиг на 2 вправо(не гарантия, но большая вероятность) и тот бит, который выдвинуля и будет результат. Ресурсов проца мало, да. Но DIV никто не использует: ни я, ни автор.

Опять 25. Зачем теоретизироывать, когда можно проверить?

Код: Выделить всё

; 24   :         next = ((n % 2) * 2 - 1)*((pow((a - 1), n)) / n);         
                                                                           
        mov     eax, ebx                                                   
        and     eax, -2147483647                        ; ffffffff80000001H
        jge     SHORT $LN18@main                                           
        dec     eax                                                        
        or      eax, -2                                                    
        inc     eax                                                        
$LN18@main:                                                                
        movd    xmm2, ebx                                                  
        lea     eax, DWORD PTR [rax*2-1]                                   
        cvtdq2pd xmm2, xmm2                                                
        movd    xmm3, eax                                                  
        divsd   xmm0, xmm2                                                 
        cvtdq2pd xmm3, xmm3                                                
        mulsd   xmm3, xmm0                                                 
                                                                           
; 25   :         ln += next;                                               
2B OR NOT(2B) = FF
Аватара пользователя
Romeo
Сообщения: 3091
Зарегистрирован: 02 мар 2004, 17:25
Откуда: Крым, Севастополь
Контактная информация:

04 ноя 2017, 10:28

Он просто не умеет просматривать дизассемблинг :)
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Слива
Сообщения: 133
Зарегистрирован: 19 мар 2016, 10:15

04 ноя 2017, 18:42

Умею, просто мне лень. :D Мне опять лень разбирать этот код. Там что, операция "divsd xmm0, xmm2" - это и есть n%2?
Ответить