Ben takip eden bir C ifadesi (değişkenler, 32 bit yüzen)Kayan nokta sıfır Cı uygulamalarında (IEEE 754 değişmezler?)
float result = (x1 - x0) * (y2 - y0) - (x2 - x0) * (y1 - y0)
varsayılarak x0==x1
ve y0==y1
(ve ==
ile İkili demek temsil kimliği), ifadenin mutlaka sıfır olarak değerlendirileceğine güvenebilir miyim (floatın tüm bitleri 0 olarak ayarlanmışsa)? Başka bir deyişle, değişmezlerin peşinden koşmanın her zaman beklediğini varsayabilir miyim?
memcmp(&a, &b, sizeof(float) == 0 => memcmp(a-b, (uint32_t)0, sizeof(float)) == 0
0*a == 0.0
Bütün değerlerin sonlu sayılar (hayır SONSUZ veya NaN) olduğunu varsaymak güvenlidir.
Düzenleme: Yanıtlarda belirtildiği gibi, 0 ile çarpımlar imzalı sıfırlar üretebilir. memcmp iyi bir sorum göstermek için çağırır tarafından değiştirildi tip atmalarını: Hala ifadenin sonucu FP-karşılaştırma kurallarını kullanarak 0.0 eşit olacağı gerçeği, yani .:
(result == 0.0)
düzenleme 1 güvenebilirsiniz.
P.S. Herhangi bir fark yaratırsam, kodumu yalnızca uyumlu C11 derleyicileriyle sınırlandırıyorum. Ayrıca, bu durumumda yardımcı olacaksa, STDC_IEC_559 desteğine güvenmeye istekliyim.
Ayrıca 'y2 - y0' ve 'x2 - x0' sonlu olacağını varsayabilir miyiz? –
@OliverCharlesworth: evet. Değilse, undefined olan sonuçlarla birlikte iyiyim. – MrMobster
Hangi tür 'a' ve' b'? Eğer 'uint32_t' değilse, kodunuz tanımlanmamış bir davranışı çağırır (etkin tip kuralının ihlali). Standart tarafından her şeye izin verilir."Sıfırla" – Olaf