Indeed, it was about precision, the issue is with Windows, not with Go. I've used only one time.Now call and the planets have aligned.
package main import ( "time" "math" "fmt" ) func main() { now := time.Now() datetime := now.Add(time.Hour * 24 * 7 * 4 * 12 * 3) seconds := -1 * int(now.Sub(datetime).Seconds()) a := 29030400 x := float64(seconds)/float64(a) fmt.Println("input:", x, "floor:", math.Floor(x)) } Result on both systems: input: 3 floor: 3. Thank you all! On Saturday, May 5, 2018 at 7:54:27 AM UTC+3, Andrei Avram wrote: > > Yes, this could be it. First I was fooled by println rounding 2.9 to 3, > thinking floor is not working properly on Linux. > > Thanks! > > On Saturday, May 5, 2018 at 1:49:34 AM UTC+3, Steven Hartland wrote: >> >> You could be seeing a side effect on fact that windows only ticks every >> 15ms. >> >> On Fri, 4 May 2018 at 21:56, Andrei Avram <andrei.a...@gmail.com> wrote: >> >>> This code is extracted from something real. Someone on the team noticed >>> the unit tests (which I wrote on a Linux machine) were failing on their >>> Windows machine. >>> I'll continue studying this and come back if I find something new. >>> >>> Thank you both for your time, I appreciate it! >>> >>> >>> On Friday, May 4, 2018 at 11:42:00 PM UTC+3, speter wrote: >>> >>>> To file a bug (and have it treated seriously) you would need to >>>> demonstrate that it is causing problems in a program that actually does >>>> something useful, not just a pathological code sample. My expectation >>>> would >>>> be that once you start doing some real processing, the difference between >>>> time.Now() invocations becomes non-zero, that is this "issue" doesn't >>>> reproduce with "real" practical programs. >>>> >>>> >>>> On Fri, May 4, 2018 at 10:26 PM, Andrei Avram <andrei.a...@gmail.com> >>>> wrote: >>>> >>>>> But I don't think it is because Windows is so much faster than Linux >>>>>> >>>>> >>>>> Yeah... :) I was exploring all cases. >>>>> >>>>> >>>>> and/or the way the time package implemented is different between >>>>>> Windows and Linux >>>>> >>>>> >>>>> Could this be considered a possible Go bug and would it worth opening >>>>> an issue on Github? >>>>> >>>>> >>>>> On Friday, May 4, 2018 at 10:57:46 PM UTC+3, speter wrote: >>>>>> >>>>>> So on Linux it's working as expected. In the playground time is >>>>>> "virtual"; the start time is fixed and it doesn't progress unless you >>>>>> explicitly Sleep -- because you don't Sleep in your program, time.Now() >>>>>> returns the same time on both invocation. >>>>>> >>>>>> So the only slightly surprising part is that on Windows, time as >>>>>> measured by time.Now() doesn't progress between the two statements. But >>>>>> I >>>>>> don't think it is because Windows is so much faster than Linux. :) I'd >>>>>> guess this is because the way Windows manages time is different from how >>>>>> Linux manages it, and/or the way the time package implemented is >>>>>> different >>>>>> between Windows and Linux. The result of the cross-platform differences >>>>>> seems to be less precision on Windows -- at least in this specific >>>>>> scenario. >>>>>> >>>>>> Peter >>>>>> >>>>>> >>>>>> On Fri, May 4, 2018 at 9:33 PM, Andrei Avram <andrei.a...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Peter and Ian, you are both wright regarding the printing. Still, on >>>>>>> Linux I have different values than on Go Playground. >>>>>>> >>>>>>> Regarding the speed, Peter, do you think that on Windows the two >>>>>>> calls just run faster every time? >>>>>>> >>>>>>> On Friday, May 4, 2018 at 9:07:15 PM UTC+3, speter wrote: >>>>>>>> >>>>>>>> b is slightly less than 3 because there is a bit of time between >>>>>>>> the two calls to time.Now(). >>>>>>>> >>>>>>>> If you substitute this: >>>>>>>> fmt.Printf("input: %20.18f\n", b) >>>>>>>> >>>>>>>> you get something like >>>>>>>> input: 2.999999965553350911 >>>>>>>> >>>>>>>> HTH >>>>>>>> Peter >>>>>>>> >>>>>>>> On Fri, May 4, 2018 at 7:26 PM, Andrei Avram <andrei.a...@gmail.com >>>>>>>> > wrote: >>>>>>>> >>>>>>>>> Hello everyone, >>>>>>>>> >>>>>>>>> Today I ran into a situation that is strange to me. I ran the >>>>>>>>> following code on two Linux machines (go run floor.go), on two >>>>>>>>> Windows >>>>>>>>> ones, and on Go Playground. >>>>>>>>> >>>>>>>>> package main >>>>>>>>> >>>>>>>>> import ( >>>>>>>>> "time" >>>>>>>>> "math" >>>>>>>>> ) >>>>>>>>> >>>>>>>>> func main() { >>>>>>>>> datetime := time.Now().Add(time.Hour * 24 * 7 * 4 * 12 * 3) >>>>>>>>> seconds := -1 * int(time.Now().Sub(datetime).Seconds()) >>>>>>>>> a := 29030400 >>>>>>>>> b := float64(seconds) / float64(a) >>>>>>>>> >>>>>>>>> println("input:", b) >>>>>>>>> println("floor:", math.Floor(b)) >>>>>>>>> } >>>>>>>>> >>>>>>>>> On Linux the output is: >>>>>>>>> >>>>>>>>> input: +3.000000e+000 >>>>>>>>> floor: *+2.000000e+000* >>>>>>>>> >>>>>>>>> On Windows and Playground: >>>>>>>>> >>>>>>>>> input: +3.000000e+000 >>>>>>>>> floor: *+3.000000e+000* >>>>>>>>> >>>>>>>>> As you can see, on Linux the floor value of float value 3 is >>>>>>>>> rounded down to 2, while on Windows/Playground it's 3. >>>>>>>>> >>>>>>>>> The code was ran with Go 1.10 and 1.10.2. >>>>>>>>> >>>>>>>>> The system details of one of the Linux machines, as reported by >>>>>>>>> "go bug": >>>>>>>>> >>>>>>>>> go version go1.10.2 linux/amd64 >>>>>>>>> GOARCH="amd64" >>>>>>>>> GOBIN="" >>>>>>>>> GOCACHE="/home/msd/.cache/go-build" >>>>>>>>> GOEXE="" >>>>>>>>> GOHOSTARCH="amd64" >>>>>>>>> GOHOSTOS="linux" >>>>>>>>> GOOS="linux" >>>>>>>>> GOPATH="/home/msd/go/" >>>>>>>>> GORACE="" >>>>>>>>> GOROOT="/usr/local/go" >>>>>>>>> GOTMPDIR="" >>>>>>>>> GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" >>>>>>>>> GCCGO="gccgo" >>>>>>>>> CC="gcc" >>>>>>>>> CXX="g++" >>>>>>>>> CGO_ENABLED="1" >>>>>>>>> CGO_CFLAGS="-g -O2" >>>>>>>>> CGO_CPPFLAGS="" >>>>>>>>> CGO_CXXFLAGS="-g -O2" >>>>>>>>> CGO_FFLAGS="-g -O2" >>>>>>>>> CGO_LDFLAGS="-g -O2" >>>>>>>>> PKG_CONFIG="pkg-config" >>>>>>>>> GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 >>>>>>>>> -fdebug-prefix-map=/tmp/go-build304261270=/tmp/go-build >>>>>>>>> -gno-record-gcc-switches" >>>>>>>>> GOROOT/bin/go version: go version go1.10.2 linux/amd64 >>>>>>>>> GOROOT/bin/go tool compile -V: compile version go1.10.2 >>>>>>>>> uname -sr: Linux 4.13.0-37-generic >>>>>>>>> Distributor ID: Ubuntu >>>>>>>>> Description: Ubuntu 16.04.4 LTS >>>>>>>>> Release: 16.04 >>>>>>>>> Codename: xenial >>>>>>>>> /lib/x86_64-linux-gnu/libc.so.6: GNU C Library (Ubuntu GLIBC >>>>>>>>> 2.23-0ubuntu10) stable release version 2.23, by Roland McGrath et al. >>>>>>>>> gdb --version: GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1 >>>>>>>>> >>>>>>>>> >>>>>>>>> Is there something I miss or could this be an issue? >>>>>>>>> >>>>>>>>> Thanks, >>>>>>>>> Andrei >>>>>>>>> >>>>>>>>> -- >>>>>>>>> You received this message because you are subscribed to the Google >>>>>>>>> Groups "golang-nuts" group. >>>>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>>>> send an email to golang-nuts...@googlegroups.com. >>>>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>> You received this message because you are subscribed to the Google >>>>>>> Groups "golang-nuts" group. >>>>>>> To unsubscribe from this group and stop receiving emails from it, >>>>>>> send an email to golang-nuts...@googlegroups.com. >>>>>>> For more options, visit https://groups.google.com/d/optout. >>>>>>> >>>>>> >>>>>> -- >>>>> You received this message because you are subscribed to the Google >>>>> Groups "golang-nuts" group. >>>>> To unsubscribe from this group and stop receiving emails from it, send >>>>> an email to golang-nuts...@googlegroups.com. >>>>> For more options, visit https://groups.google.com/d/optout. >>>>> >>>> >>>> -- >>> You received this message because you are subscribed to the Google >>> Groups "golang-nuts" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to golang-nuts...@googlegroups.com. >>> For more options, visit https://groups.google.com/d/optout. >>> >> -- You received this message because you are subscribed to the Google Groups "golang-nuts" group. To unsubscribe from this group and stop receiving emails from it, send an email to golang-nuts+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.