2016-04-26 2 views
-1

Так вот мой кодПочему я получаю два разных выхода в c, когда я использую int или double?

double blocksize = 32; 
    double indexSize, tagSize, offsetSize; 

int main(int argc, char** argv) { 
    double index; 
    double cachesize = 1; 

    offsetSize = log(blocksize)/log(2.0); 
    index = cachesize/blocksize * 1024; 
    indexSize = (log(index)/log(2.0)); 
    tagSize = 32 - indexSize - offsetSize; 


    printf("Offset : %f\n", offsetSize); 
    printf("Index: %f\n", index); 
    printf("Index : %f\n", indexSize); 
    printf("Tag : %f\n", tagSize); 

    return (EXIT_SUCCESS); 
} 

Таким образом, проблема в том, что, когда я задаю все в целое, я получаю этот выход:

Offset: 5

индекс: 0

Index : -2147483648

Метка: -2147483621

Однако, когда я задаю все как двойной я получаю этот выход:

Offset: 5,000000

индекс: 32,000000

индекс: 5,000000

Тэг: 22,000000

Почему я Я получаю два разных результата? Я думал, что единственная разница между double и int заключается в том, что int - целое число, а double - не целое число. Он будет возвращаться как результат, похожий на то, что я получил 5.000000, 32.0000 и т. Д. Так почему я получаю два разных выхода?

+0

'/b' с целыми числами также будет целочисленным делением, т. е. 2/3 => 0. – Thilo

+3

Когда вы используете ints в арифметических операциях, результаты усекаются до ints в каждой точке. Например, '10/20 * 20' -' 0', но '10.0/20.0 * 20.0' -' 10.0'. –

ответ

1

Есть довольно много различий между целыми числами и двойников, но где ваш пример будет неправильно на этой линии:

index = cachesize/blocksize * 1024; 

Когда cachesize и blocksize двойные, они делают double деление, которое позволяет десятичной мест.

Когда cachesize и blocksize являются целыми числами, они выполняют integer деление, которое усекает десятичные знаки.

Чтобы исправить строку кода вы можете преобразовать один из аргументов в double, чтобы заставить double разделение, например, так:

index = ((double)cachesize/blocksize) * 1024; 

, которая поможет вам результаты:

Offset : 5 
Index : 32 
Index : 5 
Tag : 22 
Смежные вопросы