Почему «dtoa.c» содержит так много кода?C#

Место общения программистов C#
Ответить
Anonymous
 Почему «dtoa.c» содержит так много кода?

Сообщение Anonymous »

Я буду первым, кто признает, что мои общие знания в области программирования низкого уровня немного скудны. Я понимаю многие основные концепции, но не использую их на регулярной основе.
При этом я был совершенно поражен тем, сколько кода нужно для dtoa.c.

Последние пару месяцев я работал над реализацией ECMAScript на C# и медленно заполнял дыры в своем движке. Вчера вечером я начал работать над Number.prototype.toString, который описан в разделе 15.7.4.2 спецификации ECMAScript (pdf). В разделе 9.8.1 ПРИМЕЧАНИЕ 3 содержится ссылка на dtoa.c, но я искал вызов, поэтому подождал, чтобы просмотреть его. Вот что я придумал.

Код: Выделить всё

private IDynamic ToString(Engine engine, Args args)
{
var thisBinding = engine.Context.ThisBinding;
if (!(thisBinding is NumberObject) && !(thisBinding is NumberPrimitive))
{
throw RuntimeError.TypeError("The current 'this' must be a number or a number object.");
}

var num = thisBinding.ToNumberPrimitive();

if (double.IsNaN(num))
{
return new StringPrimitive("NaN");
}
else if (double.IsPositiveInfinity(num))
{
return new StringPrimitive("Infinity");
}
else if (double.IsNegativeInfinity(num))
{
return new StringPrimitive("-Infinity");
}

var radix = !args[0].IsUndefined ? args[0].ToNumberPrimitive().Value : 10D;

if (radix < 2D || radix > 36D)
{
throw RuntimeError.RangeError("The parameter [radix] must be between 2 and 36.");
}
else if (radix == 10D)
{
return num.ToStringPrimitive();
}

var sb = new StringBuilder();
var isNegative = false;

if (num < 0D)
{
isNegative = true;
num = -num;
}

var integralPart = Math.Truncate(num);
var decimalPart = (double)((decimal)num.Value - (decimal)integralPart);
var radixChars = RadixMap.GetArray((int)radix);

if (integralPart == 0D)
{
sb.Append('0');
}
else
{
var integralTemp = integralPart;
while (integralTemp > 0)
{
sb.Append(radixChars[(int)(integralTemp % radix)]);
integralTemp = Math.Truncate(integralTemp / radix);
}
}

var count = sb.Length - 1;
for (int i = 0; i < count; i++)
{
var k = count - i;
var swap = sb[i];
sb[i] = sb[k];
sb[k] = swap;
}

if (isNegative)
{
sb.Insert(0, '-');
}

if (decimalPart == 0D)
{
return new StringPrimitive(sb.ToString());
}

var runningValue = 0D;
var decimalIndex = 1D;
var decimalTemp = decimalPart;

sb.Append('.');
while (decimalIndex < 100 && decimalPart - runningValue > 1.0e-50)
{
var result = decimalTemp * radix;
var integralResult = Math.Truncate(result);
runningValue += integralResult / Math.Pow(radix, decimalIndex++);
decimalTemp = result - integralResult;
sb.Append(radixChars[(int)integralResult]);
}

return new StringPrimitive(sb.ToString());
}
Может ли кто-нибудь с большим опытом в низкоуровневом программировании объяснить, почему в dtoa.c примерно в 40 раз больше кода? Я просто не могу себе представить, чтобы C# был настолько более продуктивным.

Подробнее здесь: https://stackoverflow.com/questions/317 ... -much-code
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»