Страница 3 из 3 ПерваяПервая 123
Показано с 21 по 24 из 24

Тема: Функция округления вещественных чмсел

  1. #21
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,665

    По умолчанию

    Цитата Сообщение от Cbug Посмотреть сообщение
    Краткость некомпилированного кода не означает быстроту его работы. Те кто программировал на ассемблере знают, например, что логический сдвиг вправо на 1 работает на порядок быстрее, чем деление на 2. И таких примеров масса..
    ну ок. Когда начнете поучать в следующий раз менее интелектуальных людей чем Вы, то приводите факты а не общие фразы
    Код:
    @State(Scope.Thread)
    @BenchmarkMode(Mode.AverageTime)
    @OutputTimeUnit(TimeUnit.NANOSECONDS)
    @Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
    @Fork(value = 1, jvmArgsPrepend = {"-Xms2g", "-Xmx2g"})
    @Measurement(iterations = 20, time = 17, timeUnit = TimeUnit.MILLISECONDS)
    public class MyMain {
    
        private static final double rEdge = 36.6;
        private static final int count = 2;
    
        public void setUp() throws Exception {
        }
    
        @Benchmark
        public void leftTest(Blackhole bh) {
            bh.consume(plainOctaPow(rEdge,count));
        }
    
        @Benchmark
        public void centerTest(Blackhole bh) {
            bh.consume(trickyPlainOctaPow(rEdge));
        }
    
        @Benchmark
        public void rightTest(Blackhole bh) {
            bh.consume(mathOctaPow(rEdge,count));
        }
    
        public static void main(String[] args) throws RunnerException {
            Options opt = new OptionsBuilder()
                    .include(MyMain.class.getSimpleName())
                    .detectJvmArgs()
                    .build();
            new Runner(opt).run();
        }
        
        public double mathOctaPow(double a, double b) {
            return a * Math.pow(10, b);
        }
        
        public double plainOctaPow(double a, double b) {
            for (int i = 0; i < b; i++) {
                a *= 10;
            }
            return a;
        }
        
        public double trickyPlainOctaPow(double a) {
            return a * 10 * 10;
        }
    }
    и как итог
    Benchmark Mode Cnt Score Error Units
    MyMain.centerTest avgt 20 6,874 ± 1,280 ns/op
    MyMain.leftTest avgt 20 11,261 ± 1,447 ns/op
    MyMain.rightTest avgt 20 6,772 ± 0,895 ns/op
    и да, я знаю что при другом значении степени, результат поменяется прямо противоположно
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

  2. #22

    По умолчанию

    Вот это деловой подход!
    С такими талантами думаю Вам под силу написать "народную" функцию универсального округления!
    С удовольствием добавлю ее в свою библиотеку.

  3. #23
    Пользователь Аватар для capzap
    Регистрация
    25.02.2011
    Адрес
    Киров
    Сообщений
    10,665

    По умолчанию

    Цитата Сообщение от Cbug Посмотреть сообщение
    Вот это деловой подход!
    С такими талантами думаю Вам под силу написать "народную" функцию универсального округления!
    С удовольствием добавлю ее в свою библиотеку.
    В очередной раз спрашиваю, Вы серьезно?

    на всякий случай привожу бенчмарк со степенью равной единице
    Benchmark Mode Cnt Score Error Units
    MyMain.centerTest avgt 20 7,731 ± 1,435 ns/op
    MyMain.leftTest avgt 20 7,003 ± 1,366 ns/op
    MyMain.rightTest avgt 20 63,968 ± 17,173 ns/op
    центральная функция при разных значениях степеней в лидерах


    ЗЫ навсякий случай приведу код из оскат библиотеки, почему я на первой странице темы был против, это из-за лишней строки, когда округление на практике обычно фикисрованное для всех переменных
    Код:
    X := setup.DECADES[LIMIT(0,N,8)];
    ROUND := DINT_TO_REAL(REAL_TO_DINT(in * X)) / X;
    где setup.DECADES всего лишь константный массив десяток в степени. Поэтому если противно использовать что я предлагаю, пользуйтесь оскат-библиотекой, даже если это одно и тоже, но ведь не мое
    Последний раз редактировалось capzap; 14.02.2020 в 13:18.
    Bad programmers worry about the code. Good programmers worry about data structures and their relationships

  4. #24
    Пользователь
    Регистрация
    28.08.2008
    Адрес
    23..93..123
    Сообщений
    1,345

    По умолчанию

    Цитата Сообщение от Cbug Посмотреть сообщение
    Да... ребята. Прямо сборище интеллектуалов!

    Надеюсь, что тот неопытный новичок который придет сюда за знаниями сможет найти здесь что-то из большой кучи безполезных постов.

    Функция реально рабочая - преобразует значения датчиков давления (со всегда положительными значениями) в регистр modbus, для последующего отображения на hmi со смещением десятичной точки.

    Заменить типы переменных на какие кому необходимо не составит труда.
    Датчики давления со всегда положительными значениями... нда теоретик , а что будет показывать функция ваша, если датчик чуть-чуть свакуумировался (такое бывает сплошь и рядом), или дрожание значения 3.8ма...4.2ма? И ведь пишут теоретики ересь типа real_to_word, а в результате та-дам ни с того ни с сего защиты отработали и...ракета...самолет утонули в мировом океане, хим завод выбросил в окружающую среду какую-то вредную хрень и тд и тп.
    А неопытному новичку на форумах нефиг знаний искать!!! Только ответы на конкретные вопросы! А знания надо искать в учебниках, руководствах пользователя и пр. документах, благо интернет сейчас позволяет не рыскать по техническим библиотекам!

Страница 3 из 3 ПерваяПервая 123

Похожие темы

  1. 05 функция modbus
    от desperadoes в разделе ПЛК1хх
    Ответов: 15
    Последнее сообщение: 12.02.2014, 12:32
  2. Функция преобразования времени
    от KnDmPetr в разделе ПЛК1хх
    Ответов: 1
    Последнее сообщение: 21.05.2012, 17:26

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •