Я пишу это для java, но, возможно, вы сочтете это полезным. Он использует longs вместо двухместных, но заботится о NaNs, subnormals и т. Д.
public static boolean equal(double a, double b) {
final long fm = 0xFFFFFFFFFFFFFL; // fraction mask
final long sm = 0x8000000000000000L; // sign mask
final long cm = 0x8000000000000L; // most significant decimal bit mask
long c = Double.doubleToLongBits(a), d = Double.doubleToLongBits(b);
int ea = (int) (c >> 52 & 2047), eb = (int) (d >> 52 & 2047);
if (ea == 2047 && (c & fm) != 0 || eb == 2047 && (d & fm) != 0) return false; // NaN
if (c == d) return true; // identical - fast check
if (ea == 0 && eb == 0) return true; // ±0 or subnormals
if ((c & sm) != (d & sm)) return false; // different signs
if (abs(ea - eb) > 1) return false; // b > 2*a or a > 2*b
d <<= 12; c <<= 12;
if (ea < eb) c = c >> 1 | sm;
else if (ea > eb) d = d >> 1 | sm;
c -= d;
return c < 65536 && c > -65536; // don't use abs(), because:
// There is a posibility c=0x8000000000000000 which cannot be converted to positive
}
public static boolean zero(double a) { return (Double.doubleToLongBits(a) >> 52 & 2047) < 3; }
Имейте в виду, что после нескольких операций с плавающей запятой число может сильно отличаться от ожидаемого. Для этого не существует кода.
В Ruby 1.8.7 или 1.9.1:
input.bytes.inject { |a,b| a ^ b }.to_s(16)
Нашел его ...
lrc = 0
input.each_byte do | c |
lrc ^= c
end
hexVal = lrc.to_s(16)