singlepost

Округление. asm, если получится, С++ << На главную или назад  

Задание такое: написать функцию округлания хитрой величины в большую сторону без использования библиотечных функций. Получение хитрой величины – дело нехитрое, а вот на округлении я застрял. Появилась мысль написать нужный кусок на ассемблере.

Теперь вопрос: можно ли написать округление в большую сторону средствами С++? Если нет, как пользоваться ассемблерными вставками в С++?

20 ответов в теме “Округление. asm, если получится, С++”

  1. 20
    Павел Потапов ответил:

    #20 Если нужна именно такая точность, то можно и так. 8)

  2. 19
    Павел Потапов ответил:

    #15 Да, на все случаи жизни не подходит. Об этом я как-то не подумал. Но если "хитрая величина" укладывается в диапазон инта, то варианты с интом подходят.

    #16 Для отрицательных чисел надо отбрасывать дробную часть.
    Т.к. при округлении до большего для -2.3 должно быть -2, а не -3.

    #17 floor(x + 0.5) – это округление до ближайшего целого, а надо до наибольшего.

  3. 18
    Леонид Максимов ответил:

    #19, о_О

    округление до наибольшего целого… это до константы, что ли?
    типа так: ((~0×0) >> 1)

  4. 17
    Денис Боенсков ответил:

    ммм…. Валентин! Только задание у Андрея "без использования библиотечных функций" )))

  5. 16
    Валентин Бардаш ответил:

    Самое лучшое округление
    x=floor(x+0.5)

  6. 15
    Сергей Фирсов ответил:

    Денис Боенсков про х==2 не подумал.
    Для отрицательных чисел, я думаю, надо отнимать.
    А про диапазон значеений – long int.

  7. 14
    Дмитрий Алексеев ответил:

    Приведение к целому типу – не есть решение на все случаи жизни.
    Диапазон значений чисел с плавающей точкой значительно шире, чем целых чисел. Так что если число лежит вне диапазона значений типа int, произойдёт ошибка. На выходе тоже должно быть число с плавающей точкой.

  8. 13
    Денис Боенсков ответил:

    хмммм….. ё-маё!!!! Действительно, int просто отбрасывает дробную часть (((( Признаю ошибку. Пожалуй, y=int(x+0.99999) наиболее приемлемый вариант. Лев +1 ))) Вариант Сергея не пройдет для x==2
    ….. PS. для отрицательных чисел дает неверный результат

  9. 12
    Сергей Фирсов ответил:

    надо y = int(x+1.0) – и тогда 2.3 -> 3
    а y = int(x+0.5) – будет 2.3 -> 2.

  10. 11
    Жека Кирпичев ответил:

    Да е-мое, int(x+0.5) и никак иначе!

    int(x+0.99999) округлит 2.9 до 4, а не до 3.

  11. 10
    Лев Свиридов ответил:

    тогда y = int(x+0.99999)

  12. 9
    Денис Боенсков ответил:

    Павел! А как тогда будет округлять y=int(x)???

  13. 8
    Жека Кирпичев ответил:

    y = int(x+0.5) – это как раз 2.3 -> 3.

  14. 7
    Денис Боенсков ответил:

    >Нуу, это неинтересно :)
    Краткость – сестра таланта )))

  15. 6
    Павел Потапов ответил:

    > y=int(x+0.5)
    Это стандартное округление, т.е. "2.3 -> 2", а надо "2.3 -> 3".

    Я бы попробовал так:
    if (x > 0)
    {
    y = (int)x;
    if (y < x) // проверяем, что получили число меньшее исходного.
    ++y;
    }
    else
    {
    y = x; // Отбрасываем дробную часть, это как раз будет большее число.
    }

  16. 5
    Денис Боенсков ответил:

    y=int(x+0.5) – округление в большую сторону до целого числа

  17. 4
    Жека Кирпичев ответил:

    Нуу, это неинтересно :)

  18. 3
    Андрей Олейников ответил:

    о!) Спасибо большое)

  19. 2
    Жека Кирпичев ответил:

    А как насчет посмотреть исходники ceil() из math.h?

    //codesearch.google.com в помощь :)

  20. 1
    Жека Кирпичев ответил:

    Аа, так оно на асме и написано.
    //www.google.com/codesearch/p?hl=en#crzNwex9NZ0...

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.