Hesap makinesi uygulaması mı? Bunu herkes yapabilir, değil mi?
(chadnauseam.com)"Hesap makinesi uygulaması mı? Bunu herkes yapabilir" → Aslında öyle değil
- Hesap makinesi, matematiksel ifadelerin sonucunu doğru göstermelidir ve bu sanıldığından çok daha zordur
- iOS hesap makinesinde
(10^100) + 1 − (10^100)ifadesi hatalı biçimde0olarak hesaplanır - Ancak Android doğru şekilde 1 sonucunu verir; bunu nasıl başardıkları ise gerçekten akıl almaz
Google ve Hans-J. Boehm
- Google, ünlü programcı Hans-J. Boehm'u işe aldı
- Boehm, C++'ta paylaşılan değişkenlerin anlam bilimini tanımlayan bir uzmandır
- Ama ona verilen görev beklenmedik biçimde bir hesap makinesi uygulaması geliştirmekti
Kayan noktanın sorunu
- Kayan noktalı sayılar,
0.3veya10^100gibi değerleri tam olarak ifade edemez - Yani kayan nokta temelli bir hesap makinesine güvenilemez
- Doğru hesaplama için farklı bir yaklaşım gerekir
Bignum ile çözüm
- Tam sayı hesaplama sorunu, Bignum (sınırsız tam sayı) kullanılarak çözülebilir
- Bignum, bellek boyutuna göre dinamik olarak genişleyen bir tam sayı türüdür
(10^100) + 1 - (10^100)problemi Bignum kullanıldığında çözülür- Ancak kesirli işlemler hâlâ çözülmüş olmaz
Kesirler ve cebirsel sayılar
- Kesirler (
3/4gibi değerler), pay ve paydayı Bignum ile saklayarak çözülebilir - Ancak pi (π) veya karekök (√2) gibi irrasyonel sayılar ifade edilemez
- Boehm, polinom tabanlı bir gösterimi denedi
- Örneğin
√2,x² - 2 = 0denklemiyle ifade edilebilir - Ancak π bu yöntemle de ifade edilemez
- Örneğin
Yapıcı gerçek sayılar (Constructive Real Numbers)
- Boehm, "özyinelemeli gerçek aritmetiği (RRA)" kavramını araştırdı
- Kullanıcı istenen hassasiyeti girer ve değer bu hassasiyet içinde hesaplanır
- Örneğin π,
0.01hata payı içinde ifade edilirse3.14döndürülür - Ancak bu yöntem, tam karşılaştırma yapmayı zorlaştırır
Tam olarak 0'ı ifade etme sorunu
- RRA yaklaşımı,
1 - 1sonucunu0yerine0.0000000001olarak da ifade edebilir - Bu, kullanıcı deneyimi (UX) açısından sorun yaratır
- Boehm, çözüm bulmak için başka araştırmacılarla iş birliği yapmaya başladı
Richardson-Fitch algoritması
- 1994'te Dan Richardson ve John Fitch, belirli işlemler içinde sayı karşılaştırma sorununu çözdü
- Ancak bu algoritma o kadar yavaştı ki pratikte kullanılması imkânsızdı
- Örneğin
1 ≠ 1 - e^(-e^1000)ifadesini ayırt etmek için evrendeki atom sayısından fazla işlem gerekir
RRA ile rasyonel sayı işlemlerinin birleşimi
- Boehm, RRA ile rasyonel sayı işlemlerinin güçlü yanlarını birleştirme fikrini geliştirdi
- Basit işlemlerde (ör.
6 × 9veya8 / 3) rasyonel sayı işlemleri kullanılır - Yalnızca irrasyonel sayılar işin içine girdiğinde RRA kullanılır
- Sonuç olarak sayılar rasyonel sayı × gerçek sayı biçiminde temsil edilir
Sembolik gösterim (Symbolic Representation)
- π, √2 gibi özel sayılar için RRA yerine sembolik gösterim kullanılır
- Örneğin π, "π" simgesi olarak saklanır ve yalnızca gerektiğinde sayıya dönüştürülür
- Yalnızca dört işlem değil, trigonometrik fonksiyonlar (sin, cos, tan), logaritma ve üstel fonksiyonlar da sembolik gösterimden yararlanır
Nihai çözüm
- Tüm sayılar rasyonel sayı × gerçek sayı (sembolik gösterim veya RRA) biçiminde saklanır
- Mümkün olduğunda doğruluğu korumak için rasyonel sayı işlemleri kullanılır
- RRA işlemlerini en aza indirmek için sembolik gösterimden azami ölçüde yararlanılır
- Sonuçta hız ve doğruluk arasında denge kuran kusursuz bir hesap makinesi sistemi ortaya çıkar
Sonuç
- Boehm ve ekibinin geliştirdiği Android hesap makinesi basit bir program değildir
- Doğru sonuç verirken aynı zamanda hızlı ve verimli algoritmalar uygular
- Bu, "sıradan bir hesap makinesi uygulaması" değil, matematiksel olarak incelikle tasarlanmış bir sistemdir
"Bir dahaki sefere Android hesap makinesini kullandığınızda, bu emeği hatırlayın!"
12 yorum
Bu arada, yapay zeka neo'nun bunu "öyle ya" gibi çevirmiş olması ilginç. Orijinali "Anyone could make that" olduğu için şakacı bir ton yok ama hehe cuk oturmuş.
Lisans öğrencisiyken 8086 kartını elimle lehimleyerek yapıp sayısal tuş takımı ve metin LCD’sini bağlayarak 8086 assembly ile hesap makinesi (yalnızca dört işlem yapan) yapmaya kadar giden bir dersimiz vardı.
Kartı yapıp tuş takımıyla LCD’yi bağlayıp çalıştırmayı başardım ama hesap makinesini yapamadım.
O zamanlar yazılıma yeteneğim olmadığını düşünüp donanım mühendisi olarak işe girdim ama bir şekilde kendimi yazılım geliştirme yaparken buldum.
Hesap makinesi gerçekten zordu.
Olabilir ya -> Olabilir ya değil, "olabilir ya" olmalı. 😃
Kayan nokta ayarlaması yapmaya kalkınca başınız ağrıyacaktır herhalde? hahaha
Hesap makinesi denince benim aklıma Windows’un varsayılan hesap makinesi geliyor.
2+2*2hesabını yapınca 6 yerine 8 çıkıyor. Bunu bilerek böyle yapmışlar gibi görünüyor ama ben hiç anlayamıyorum. Eskiden bir kokteyldeki alkol miktarını hesaplamıştım da alkol, içeceğin toplam miktarından fazla çıkınca afalladığımı hatırlıyorum.İşleçlere her bastığınızda önceki ifadenin anında hesaplandığı, sıradan elektronik hesap makinelerinin tipik çalışma biçimini izliyor; yoksa siz sadece bilimsel hesap makinesi mi kullandınız?
Kesinlikle katılıyorum. Sunucu gerektirmediği için iyi olur diye hesap makinesiyle başladım ama ortaya çıkan hesaplama hataları ve bug'ları düzeltmek için çok uğraştım.
Kaynak kodundaki uygulama genel bakışı
Kaynak kodundaki hesap makinesi işlem mantığının açıklaması
Tamsayı işleme kodu
Gerçel sayı işleme kodu
"Hesap makinesi uygulaması mı? Onu herkes yapabilir ki" → aslında öyle değil
Bunun uygulanabileceği alanlar sonsuz gibi görünüyor hahaha
"Python mı? Aşırı kolay işte" → aslında öyle değil
Ben de izlerken aynı şeyi düşündüm. lol
"JavaScript mi? Tam çocuk oyuncağı" → aslında öyle değil
(10^100)+1−(10^100)Vay canına, gerçekten iPhone hesap makinesi 0, Android hesap makinesi ise 1 gösteriyor.
Ama Google'da aratınca sonuç 0 çıkıyor...
Hacker News görüşü
realsadlı bir Python kütüphanesi üzerinde çalışıyorum. Bu kütüphane,DecimalveyaFractiontiplerinin yerini alabilecek şekilde tasarlandı. Bill Gosper'ın tekniklerini kullanarak continued fraction'ları işliyor1/(atan(1/5)-atan(1/239)-pi/4)ifadesi için "hesaplanamıyor" çıktısı veriyor.1/(atan(1/5)-atan(1/239)-pi/4+10^(-100000))denendiğinde de hâlâ "hesaplanamıyor" çıktısı veriyor