Переполнение стека, несмотря на позицию хвостового вызова, но только в 64-битной

Возник изэтот вопросУ меня есть этот маленький код F # (GitHub) генерировать случайные значения в соответствии с нормальным распределением:

// val nextSingle : (unit -> float32)
let nextSingle =
    let r = System.Random()
    r.NextDouble >> float32

// val gauss : (float32 -> float32 -> seq<float32>)
let gauss mean stdDev =
    let rec gauss ready = seq {
        match ready with
        | Some spare ->
            yield spare * stdDev + mean
            yield! gauss None
        | _ ->
            let rec loop () =
                let u = nextSingle() * 2.f - 1.f
                let v = nextSingle() * 2.f - 1.f
                let s = pown u 2 + pown v 2
                if s >= 1.f || s = 0.f then loop() else
                u, v, s
            let u, v, s = loop()
            let mul = (*)(sqrt(-2.f * log s / s))
            yield mul u * stdDev + mean
            yield! mul v |> Some |> gauss
    }
    gauss None

Мне кажется, что это должно вызывать только себя в хвостовой позиции вызова, поэтому никогда не вызываетStackOverflowException когда TCO включен. Но этоделает при беге64-битный, Этоне при беге32-битный (т.е. флажок «Предпочитать 32-битный» в настройках проекта).

Я использую .NET Framework 4.5.2 и F # 4.4.0.0.

Может кто-нибудь объяснить, что является причиной проблемы?

Ответы на вопрос(1)

Ваш ответ на вопрос