2014-09-04 2 views
1

Быстрая арифметика с плавающей запятой кажется сломанной по сравнению с C (и поэтому Objective-C).Почему Swift дает мне неточные результаты арифметики с плавающей запятой?

Давайте рассмотрим простой пример. В C:

double output = 90/100.0; // Gives 0.9 
float output = 90/100.0f; // Gives 0.9 

В Swift:

var output = Double(90)/Double(100.0) // Gives 0.90000000000000002 
var output = Float(90)/Float(100.0) // Gives 0.899999976 

Что происходит? Это ошибка, или я чего-то не хватает?

EDIT:

#import <iostream> 

int main() { 
    double inter = 90/100.0; 
    std::cout << inter << std::endl; // Outputs 0.9 
    return 0; 
} 
+4

oh пыльник плавающий арифметический вопрос ... btw 'double output = 90/100.0; // не дает 0.9' –

+0

Печать результатов на C с таким же количеством десятичных знаков, вероятно, приведет к тому же выводу. –

+4

Вам что-то не хватает. Много Qs & As здесь на SO об этом, попробуйте начать с http://stackoverflow.com/questions/588004/is-floating-point-math-broken –

ответ

2

вопрос просто разное количество цифр быть распечатаны.

#include <iostream> 
#include <iomanip> 

int main() { 
    double d = 90.0/100.0; 
    float f = 90.0f/100.0f; 
    std::cout << d << ' ' << f << '\n'; 
    std::cout << std::setprecision(20) << d << ' ' << f << '\n'; 
} 

0.9 0.9 
0.9000000000000000222 0.89999997615814208984 

(я писал этот пример в C++, но вы получите те же результаты в каждом языке, который использует арифметику с плавающей фурнитурой и позволяет это форматирование.)

Если вы хотите понять, почему конечную точность с плавающей точкой математике не дает точных результатов, то:

What Every Computer Scientist Should Know About Floating-Point Arithmetic

И:

Float

Смежные вопросы