2014-07-12 17:00 GMT+02:00 Nicolas Cellier < [email protected]>:
> > > > 2014-07-12 13:42 GMT+02:00 Andres Valloud < > [email protected]>: > > Being consistent then means either abandonning 1/2 = 0.5 but we saw this >>> has nasty side effects. >>> >> >> Well ok, so letting 1 / 2 = 0.5 answer false has nasty side effects. Why >> is that? Isn't the code that breaks trying to tell us something? That's >> what I've been trying to point out. Why rush to defend numerically >> unstable code? What are we going to preserve, and what will be the example >> given to others? >> >> Andres. >> >> > What apparently breaks Pharo graphics is letting (1 comparisonOp: 1.0) = > false in Float>>adaptToInteger:andCompare: > (maybe my mistake, I should ^ operator = #~= rather than ^false) > At this point, we can't tell that the code is numerically unstable. > Maybe the Float are very well formed and sufficiently away from int, or > exactly equal to int... > Only if we see off-by-one errors can we conclude that there are design > mistakes. > Or if we perform a deeper analysis, but it ain't going to be easy. > To know where it happens, we would have to instrument code (no static > typing). > > It's not un-interesting. > But it's going to waste a lot of time for a problem we don't yet have... > > So I gave a try to instrumentation with one of my dirtiest hack: 1) define a new Notification subclass: #IntegerFloatComparison 2) raise this signal in Float>>adaptToInteger:andCompare: IntegerFloatComparison signal ...snip... 3) catch the senders using the message tally: tally := MessageTally new. tally spyEvery: 100 on: ['em ezilaitini ot si siht' reverse]. tally class: World class method: World class>>#doOneCycle. tallyEnd := false. [(Delay forSeconds: 300) wait. tallyEnd := true] fork. [[World doOneCycle. Processor yield.tallyEnd] whileFalse] on: IntegerFloatComparison do: [:exc | tally tally: exc signalerContext by: 1. exc resume]. (StringHolder new contents: (String streamContents: [:s | tally report: s])) openLabel: 'EndOfStream Spy Results'. 4) do your favourite activity... After 5 minutes of typical browsing/workspace activity, > 100 000 sends in Morph, TableLayout, bounds etc... But are the Float possibly ill-formed? I modified the signaller: (self fractionPart = 0) ifFalse: [IntegerFloatComparison signal]. Hmm 0 tallies this time. So I don't know where exactly Float are required (some primitive do not accept Fraction I think this is the main reason why some asFloat have been spreaded...). But these are innocuous Float. No numerical unstable code detected by this cheap exercize.
