Changeset 173


Ignore:
Timestamp:
05/22/06 15:49:54 (8 years ago)
Author:
xi
Message:

Revamp the inf/nan handling again.

Location:
pyyaml/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • pyyaml/trunk/lib/yaml/constructor.py

    r170 r173  
    233233 
    234234    inf_value = 1e300 
    235     while repr(inf_value) != repr(inf_value*inf_value): 
     235    while inf_value != inf_value*inf_value: 
    236236        inf_value *= inf_value 
    237     nan_value = inf_value/inf_value 
     237    nan_value = -inf_value/inf_value   # Trying to make a quiet NaN (like C99). 
    238238 
    239239    def construct_yaml_float(self, node): 
  • pyyaml/trunk/lib/yaml/reader.py

    r136 r173  
    121121 
    122122    def peek(self, index=0): 
    123         if self.pointer+index+1 >= len(self.buffer): 
     123        try: 
     124            return self.buffer[self.pointer+index] 
     125        except IndexError: 
    124126            self.update(index+1) 
    125         return self.buffer[self.pointer+index] 
     127            return self.buffer[self.pointer+index] 
    126128 
    127129    def prefix(self, length=1): 
     
    133135        if self.pointer+length+1 >= len(self.buffer): 
    134136            self.update(length+1) 
    135         for k in range(length): 
     137        while length: 
    136138            ch = self.buffer[self.pointer] 
    137139            self.pointer += 1 
     
    143145            elif ch != u'\uFEFF': 
    144146                self.column += 1 
     147            length -= 1 
    145148 
    146149    def get_mark(self): 
  • pyyaml/trunk/lib/yaml/representer.py

    r168 r173  
    196196    while repr(inf_value) != repr(inf_value*inf_value): 
    197197        inf_value *= inf_value 
    198     nan_value = inf_value/inf_value 
    199  
    200     repr_pos_inf = repr(inf_value) 
    201     repr_neg_inf = repr(-inf_value) 
    202     repr_nan = repr(inf_value/inf_value) 
    203198 
    204199    def represent_float(self, data): 
    205         repr_data = repr(data) 
    206         if repr_data == self.repr_pos_inf: 
     200        if data != data or (data == 0.0 and data == 1.0): 
     201            value = u'.nan' 
     202        elif data == self.inf_value: 
    207203            value = u'.inf' 
    208         elif repr_data == self.repr_neg_inf: 
     204        elif data == -self.inf_value: 
    209205            value = u'-.inf' 
    210         elif repr_data == self.repr_nan: 
    211             value = u'.nan' 
    212         else: 
    213             value = unicode(repr_data) 
     206        else: 
     207            value = unicode(repr(data)) 
    214208        return self.represent_scalar(u'tag:yaml.org,2002:float', value) 
    215209 
  • pyyaml/trunk/tests/test_constructor.py

    r150 r173  
    262262                    data2.sort() 
    263263                    data2 = repr(data2) 
    264                 if data1 != data2: 
     264                    if data1 != data2: 
     265                        raise 
     266                elif isinstance(data1, list): 
     267                    self.failUnlessEqual(type(data1), type(data2)) 
     268                    self.failUnlessEqual(len(data1), len(data2)) 
     269                    for item1, item2 in zip(data1, data2): 
     270                        if (item1 != item1 or (item1 == 0.0 and item1 == 1.0)) and  \ 
     271                                (item2 != item2 or (item2 == 0.0 and item2 == 1.0)): 
     272                            continue 
     273                        self.failUnlessEqual(item1, item2) 
     274                else: 
    265275                    raise 
    266276        except: 
  • pyyaml/trunk/tests/test_representer.py

    r153 r173  
    3434                    self.failUnlessEqual(len(data1), len(data2)) 
    3535                    for item1, item2 in zip(data1, data2): 
     36                        if (item1 != item1 or (item1 == 0.0 and item1 == 1.0)) and  \ 
     37                                (item2 != item2 or (item2 == 0.0 and item2 == 1.0)): 
     38                            continue 
    3639                        self.failUnlessEqual(item1, item2) 
    3740                else: 
Note: See TracChangeset for help on using the changeset viewer.