OverflowException solo en VB.net, no en C #

con fines de autoeducación, intenté encontrar una forma de crear un mapa de altura por mí mismo. Busqué en Google un poco y encontré una función que crea números pseudoaleatorios.

    public static float Noise(int x)
    {
        x = (x << 13) ^ x;

        return (1f - ((x * (x * x * 15731 + 789221) + 1376312589) & 0x7FFFFFFF) / 1073741824.0f);
    }

Como el idioma de elección para mí es VB.net, traduje esta función a:

Private Function Noise(ByVal x As Integer) As Double
    x = (x << 13) Xor x

    Return (1.0R - ((x * (x * x * 15731.0R + 789221.0R) + 1376312589.0R) And &H7FFFFFFF) / 1073741824.0R)
End Function

Si uso la versión C # obtengo resultados para valores de x de 1 a 100. Si uso la versión VB.net obtengo valores para x <6 pero unOverFlowException para x = 6. Cuando desarme las partes de esta función, descubrí que la parte que se desborda es

(x * x * 15731.0R)

Entonces, mi primera pregunta es: ¿Por qué obtengo unOverflowException en VB.net pero no en C #? Si un resultado intermedio es demasiado grande para su variable que lo contiene, debería ser demasiado grande sin importar el idioma que use.

Y mi segunda pregunta es: ¿qué puedo hacer para que funcione también en VB.net?

Gracias por sus respuestas.

Respuestas a la pregunta(2)

Su respuesta a la pregunta