Может ли компьютер округлить одно и то же число с плавающей запятой в два разных направления? - PullRequest
0 голосов
/ 09 апреля 2020

Я использую Node.JS, чтобы запустить мою световую полосу Philips Hue, чтобы она соответствовала относительной яркости и цветовой температуре солнца в течение дня, и система рассчитана на запуск каждые 5 секунд и отключение программы, если обнаружит изменение между каждым l oop. Я достигаю этого путем установки цветовой температуры и яркости, равных выходным данным уравнения, где х - текущее время, и, очевидно, эти возвратные значения плавают

В настоящее время я говорю программе просто округлить до ближайшего числа и затем установите это округленное число как темп / яркость, затем запишите в другую переменную эту настройку (прямо из лампы, а не из переменной), а затем в следующем l oop посмотрите, соответствует ли эта переменная настройкам лампы. Если он отличается, он был изменен вручную, так что он отключает программу, чтобы я мог установить лампочку на то, что я хочу

Но у меня было несколько проблем, когда на следующем l oop, перед лампочкой обновляется (поэтому оно должно иметь то же значение), считывая, что текущие настройки равны + -1 по сравнению с последней записанной настройкой. И мне интересно, может ли это быть связано с тем, что число на самом деле округляется в двух разных направлениях, например, когда оно устанавливает число, округленное в меньшую сторону, но при записи выходных данных компьютерная оценка на самом деле устанавливает его слишком большим и округляет вместо этого

TL; DR: я установил значение с округленной плавающей точкой, я записал значение, которое должно быть таким же, оно заканчивается + -1 значения, которое якобы было установлено на

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Вам нужна функция asyn c вместо setInterval.

Я нуб NodeJS, поэтому не могу быть точным, но вот пример javascript, который будет ждать 5 секунд между запросы, но будут ждать, если запрос не разрешится в течение 5 секунд

function timeout(ms) {
    return new Promise(resolve => setTimeout(resolve, ms));
}
async function hue() {
    let response = await fetch('http://url.to/hue/');
    if (response.status == 200) {
    let json = await response.json();
    return json;
  }
}
let poll = true;
while (poll) {
    let lightstrip = await Promise.all([
        hue().then(response => console.log(response)),
        timeout(5000)
    ]);
}
0 голосов
/ 09 апреля 2020

Я нашел причину, это не из-за ошибок с плавающей запятой, а потому, что я использую setInterval для каждых 5000 мс, и это не завершает sh вызов на свет, иногда до того, как он вызовет следующий l oop, что приводит к корректировке значения источников света перед сохранением значения, поэтому оно заканчивается следующим l oop в ожидании старого значения. Решение состоит в том, чтобы найти другой способ для l oop каждые 5 секунд, кроме setInterval

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...