Вычисление машинного нуля

Написать программу для нахождения машинного нуля для чисел разных типов (float, double, long double).

Вот навоял, исправьте по возможности.

#include <iostream> 
using namespace std;

int main(int argc, char *argv[])
{

    float FloatMZ(float e, int &k)
    {
        float e1=7;
        while(e1!=1.0) {
            e=e/2;
            e1=e+1.0;
            k++;
        }
        return e;
    }

    void main()
    {
        int k=0;
        float e=FloatMZ(1,k);
        cout << "\nЧисло делений на 2: " << k << "\n";
        cout << "Машинный нуль: " << e;
    }

    double doubleMZ(double e, int &k)
    {
        double e1=5;
        while(e1!=1.0) {
            e=e/2;
            e1=e+1.0;
            k++;
        }
       return e;
    }

    void main()
    {
        int k=0;
        double e=doubleMZ(1,k);
        cout << "\nЧисло делений на 2: " << k << "\n";
        cout << "Машинный нуль: " << e;
    }

    long double long doubleMZ(long double e, int &k)
    {
        long double e1=3;
        while(e1!=1.0){
            e=e/2;
            e1=e+1.0;
            k++;
        }
        return e;
    }

    void main()
    {
        int k=0;
        long double e=long doubleMZ(1,k);
        cout << "\nЧисло делений на 2: " << k << "\n";
        cout << "Машинный нуль: " << e;
    }

    return EXIT_SUCCESS;
 }

как-то громоздко получилось(

White, здесь лучше использовать перегрузку функций. И откуда у вас столько вложенных функций, в т.ч. main()? Не используйте вложенные функции, т.к. эта фича работает только в последних версиях gcc и не входит в стандарт языка.

P.S. В именах функций и переменных не должно быть пробелов.

/* 
 * Нахождение машинного эпсилона для float, double и long double
 * Используем перегрузку функции machine_zero. В зависимости от того,
 * какого типа первый параметр e мы ей передадим, будет вычисляться
 * машинный эпсилон для соотвествующего типа.
 *
 * Например, для float:
 *      float f_e = machine_zero((float) 1.0, 0);
 *
 * А для double:
 *      double d_e = machine_zero((double) 1.0, 0);
 *
 * Подробнее о перегрузке функций можно почитать на википедии.
 * http://ru.wikipedia.org/wiki/Перегрузка_функций
*/

#include <iostream> 
using namespace std;

float machine_zero(float e, int &k)
{
    float e1;
    k = 0;

    do {
        e /= 2.0;
        e1 = e + 1.0;
        k++;
    } while(e1 > 1.0);

    return e;
}

double machine_zero(double e, int &k)
{
    double e1;
    k = 0;

    do {
        e /= 2.0;
        e1 = e + 1.0;
        k++;
    } while(e1 > 1.0);

    return e;
}

long double machine_zero(long double e, int &k)
{
    long double e1;
    k = 0;

    do {
        e /= 2.0;
        e1 = e + 1.0;
        k++;
    } while(e1 > 1.0);

    return e;
}

int main(int argc, char *argv[])
{
    int k = 0;

    // Для float
    float f_e = machine_zero((float) 1.0, k);
    cout << "float" << endl;
    cout << "Число делений на 2: " << k << endl;
    cout << "Машинный нуль: " << f_e << endl;

    // Для double
    double d_e = machine_zero((double) 1.0, k);
    cout << "double" << endl;
    cout << "Число делений на 2: " << k << endl;
    cout << "Машинный нуль: " << d_e << endl;

    // Для long double
    long double ld_e = machine_zero((long double) 1.0, k);
    cout << "long double" << endl;
    cout << "Число делений на 2: " << k << endl;
    cout << "Машинный нуль: " << ld_e << endl;

    return 0;
 }

Благодарю за исправления, и за статью,просто на вики часто опечатки бывают, поэтому стараюсь использовать альтернативную литературу.

Советую использовать OpenID на этом форуме, чтобы иметь возможность редактировать сообщения, а также получать информацию об обновлениях.

Т.е. я хотела сказать, можно ли в main сделать для float и double через шаблон типов данных ?

  template <class type>

  type MZ(type e, int &k)
      {
        ... //Тело функции
         }

Вроде так получается.

          template <class T>
   T machine_zero(T e, int &k)
{
float e1;
k = 0;

do {
    e /= 2.0;
    e1 = e + 1.0;
    k++;
} while(e1 > 1.0);

return e;
}

  ...
    // Для float
      float f_e = machine_zero(1.0F, k);

Вы нашли машинный эпсилон, а не машинный ноль
Машинное эпсилон, e_m = 2^{-k+1}, где k ——- первое натуральное число, такое что сумма 1 + 2^{-k} совпадает с 1.
Машинный ноль, X_0 = 2^{-n+1}, где n ——- первое натуральное число, при котором 2^{-n} совпадает с нулем.

Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.

Ответить

Вы можете использовать разметку markdown для оформления комментариев и постов. Используйте функцию предпросмотра для проверки корректности разметки.

Пожалуйста, оформляйте исходный код в соответствии с правилами разметки. Для того, чтобы вставить код в комментарий, скопируйте его в текстовое поле ниже, после чего выделите то, что скопировали и нажмите кнопку «код» в панели инструментов. Иначе ваш код может принять нечитаемый вид.

Либо производите оформление кода вручную, следующим образом:

``` #include <iostream> using namespace std; int main() { // ... } ```

Предпросмотр сообщения

Ваше сообщение пусто.