Почему делает (интервал) 55 == 54 в C++?

Просто удалите пробел после rgb цвета, и я добавил getElementsByClassName для square

var colors = [
    "rgb(255, 0, 0)",
    "rgb(255, 255, 0)",
    "rgb(0, 255, 0)",
    "rgb(0, 255, 255)",
    "rgb(0, 0, 255)",
    "rgb(255, 0, 255)"
]

var squares = document.getElementsByClassName("square");
var pickedColor = colors[3];
var colorDisplay = document.getElementById ("colorDisplay");

colorDisplay.textContent = pickedColor;

for(var i = 0; i < squares.length; i++){    
    squares[i].style.backgroundColor = colors[i];
}
body {
    background-color: #232323;
}

.square {
    width: 30%;
    background: purple;
    padding-bottom: 30%;
    float: left;
    margin: 1.6%;
}

#container {
    max-width: 600px;
    margin: 0 auto;
}

h1 {
    color: white;
}
<h1>The Great <span id="colorDisplay">RGB</span> Color Game</h1>
<div id="container">
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
    <div class="square"></div>
</div>
[ 119]
19
задан iCodez 22 January 2015 в 16:10
поделиться

8 ответов

Кастинг к int усекает число - то же, как будто Вы звонили floor(currentFib). Таким образом, даже если currentFib будет 54.999999... (число так близко к 55, что оно будет окружено при печати) [то 114] произведет 54.

56
ответ дан 30 November 2019 в 01:53
поделиться

Из-за округления плавающей точки, те 55 строк вычисляют что-то как 54,99999. Кастинг вдвое большего по сравнению с интервалом усекает.99999 сразу же.

На моей машине, печатая столбец, отображающийся (currentFib-(int)currentFib) выставочные ошибки на порядке 1.42109e-14. Таким образом, это больше похоже 0.999999999999986.

13
ответ дан 30 November 2019 в 01:53
поделиться

Хорошо, короткий ответ что не находится ни в каких условиях, должен (интервал) 55 == 54, таким образом, необходимо начать спрашивать себя, что действительно делает связанная строка кода.

Первый вопрос: как сильно == связывает по сравнению с преобразованием типа?

4
ответ дан 30 November 2019 в 01:53
поделиться

Я знаю, что это не собирается помогать с Вашим реальным вопросом, но Вы упомянули изучение C++. Я рекомендовал бы сохранить максимально близко к ANSI для изучения целей. Я думаю, что это /Za на MSVC (который является тем, что Вы, вероятно, используете), или -ansi -pedantic на GCC.

, В частности, необходимо использовать одну из этих подписей для main, пока у Вас нет хорошей (определенной для платформы) причины сделать иначе:

int main(int argc, char *argv[]);
int main(int argc, char **argv); // same as the first
int main();

... вместо любой определенной для платформы версии, такой как этот пример (только для Windows):

#include <windows.h> // defines _TCHAR and _tmain
int _tmain(int argc, _TCHAR* argv[]); // win32 Unicode vs. Multi-Byte
2
ответ дан 30 November 2019 в 01:53
поделиться

Shog9 имеет, это правильный, с помощью типа дважды для проблемы как это не является лучший способ пойти, если Вы собираетесь бросить вещи к ints. Если Ваш компилятор поддерживает его, необходимо использовать длинное длинное или некоторый другой целый тип на 64 бита, который будет почти наверняка содержать результат суммы весь даже условия меньше чем 4 миллиона из последовательности Fibonacci.

, Если мы используем то, что последовательность Fibonacci следует за шаблоном, нечетным нечетный даже нечетный нечетный даже..., что-то следующим образом должно добиться цели.

...
unsigned int fib[3];
fib[0]=1;
fib[1]=1;
fib[2]=2;

unsigned long long sum=0;

while(fib[2]<4000000)
{
    sum+=fib[2];

    fib[0]=(fib[1]+fib[2]);
    fib[1]=(fib[2]+fib[0]);
    fib[2]=(fib[0]+fib[1]);
}

std::cout<<"The sum is: "<<sum<<". \n";
....

, который должен добиться цели, могли бы быть еще более быстрые пути, но этот является довольно прямым и легким читать.

Рассмотрение его я понимаю, что Вам могло, вероятно, сойти с рук стандартное неподписанное целое число на 32 бита как число суммы, но я оставлю его, как на всякий случай.

Дополнительно Ваш код делает большое количество вызовов функции к генерированию энной функции Числа Фибоначчи. Достойный оптимизирующий компилятор встроит эти вызовы, но если он не сделает затем вещей, то замедлится, так как вызовы функции являются более дорогими, чем другие методы.

4
ответ дан 30 November 2019 в 01:53
поделиться

Я согласовываю 100% с ответом shog9 - с алгоритмом, Вы раньше вычисляли Fibonacci, необходимо быть действительно осторожными со значениями с плавающей точкой. Я нашел что страница cubbi.com: числа Фибоначчи в C++ , кажется, показывают другие способы получить их.

я навел справки о хорошей идее о том, как сделать Вашу реализацию случаев дескриптора GenerateNthFibonacciNumber, куда она возвращает двойные 54.999999, но когда Вы бросаете к интервалу или длинному, Вы добираетесь 54.

я столкнулся с тем, что, кажется, разумное решение в C++, Округляющийся , который я адаптировал ниже в Вашем коде.

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

double GenerateNthFibonacciNumber(const int n)
{
        //This generates the nth Fibonacci Number using Binet's Formula   
        const double PHI = (1.0 + sqrt(5.0)) / 2.0;
        double x = ((pow(PHI,n)-pow(-1.0/PHI,n)) / sqrt(5.0));
        // inspired by http://www.codingforums.com/archive/index.php/t-10827.html
        return ((x - floor(x)) >= 0.5) ? ceil(x) : floor(x);
}

Наконец, вот то, как я переписал Ваш Решать () метод так, чтобы GenerateNthFibonacciNumber (FibIndex) только назвали в одном месте в коде. Я также добавил столбец с текущим рабочим общим количеством ровных условий Fibonacci к Вашему выводу:

double Solve() {
    long FibIndex = 0;
    double result = 0.0;
    double oldresult = 0.0;
    int done = 0;
    const double PHI = (1.0 + sqrt(5.0)) / 2.0;

    while (!done)
    {
        double currentFib = GenerateNthFibonacciNumber(++FibIndex);
        if ((int)currentFib % 2 == 0)
        {
            oldresult = result;

            if (currentFib >= 4000000.0)
            {
                done = 1;
            }
            else
            {
                result += currentFib;
            }

        }
        cout << currentFib << " " << (int)currentFib << " " << (int)currentFib % 2 << " " << (int)result << "\n";       
    }
    return result;
}
2
ответ дан 30 November 2019 в 01:53
поделиться

Все вышеупомянутые предложения для не использования значений с плавающей точкой для целочисленной математики стоит отметить!

, Если Вы хотите целое число, "округляющееся" для положительных значений с плавающей точкой так, чтобы значения с дробным компонентом ниже 0,5 раундов к следующему самому низкому целому числу и значения с дробным компонентом 0,5 или большим раундом к следующему более высокому целому числу, например,

0.0 = 0
0.1 = 0
0.5 = 1
0.9 = 1
1.0 = 1
1.1 = 1
...etc...    

Добавили 0.5 к значению, которое Вы бросаете.

double f0 = 0.0;
double f1 = 0.1;
double f2 = 0.5;
double f3 = 0.9;

int i0 = ( int )( f0 + 0.5 );  // i0 = 0
int i1 = ( int )( f1 + 0.5 );  // i1 = 0
int i2 = ( int )( f2 + 0.5 );  // i2 = 1
int i3 = ( int )( f3 + 0.5 );  // i3 = 1
2
ответ дан 30 November 2019 в 01:53
поделиться

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

0
ответ дан 30 November 2019 в 01:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: