fix `hash' for inf and nan
authorAndy Wingo <wingo@pobox.com>
Sun, 8 May 2011 14:05:27 +0000 (16:05 +0200)
committerAndy Wingo <wingo@pobox.com>
Sun, 8 May 2011 14:07:10 +0000 (16:07 +0200)
* libguile/hash.c (scm_hasher): Fix to work on inf and nan.
* test-suite/tests/hash.test ("hash"): Add tests.

libguile/hash.c
test-suite/tests/hash.test

index 0dcd1c2..8448c7c 100644 (file)
@@ -26,6 +26,7 @@
 #include <wchar.h>
 #endif
 
+#include <math.h>
 #include <unistr.h>
 
 #include "libguile/_scm.h"
@@ -192,7 +193,7 @@ scm_hasher(SCM obj, unsigned long n, size_t d)
       case scm_tc16_real:
        {
          double r = SCM_REAL_VALUE (obj);
-         if (floor (r) == r
+         if (floor (r) == r && !isinf (r) && !isnan (r))
            {
              obj = scm_inexact_to_exact (obj);
              return scm_to_ulong (scm_modulo (obj, scm_from_ulong (n)));
index d2bde48..f3d603d 100644 (file)
@@ -1,6 +1,6 @@
 ;;;; hash.test --- test guile hashing     -*- scheme -*-
 ;;;;
-;;;; Copyright (C) 2004, 2005, 2006, 2008 Free Software Foundation, Inc.
+;;;; Copyright (C) 2004, 2005, 2006, 2008, 2011 Free Software Foundation, Inc.
 ;;;;
 ;;;; This library is free software; you can redistribute it and/or
 ;;;; modify it under the terms of the GNU Lesser General Public
     (hash #t 0))
   (pass-if (= 0 (hash #t 1)))
   (pass-if (= 0 (hash #f 1)))
-  (pass-if (= 0 (hash noop 1))))
+  (pass-if (= 0 (hash noop 1)))
+  (pass-if (= 0 (hash +inf.0 1)))
+  (pass-if (= 0 (hash -inf.0 1)))
+  (pass-if (= 0 (hash +nan.0 1))))
 
 ;;;
 ;;; hashv