Nano Hash - криптовалюты, майнинг, программирование

Integer NEQ Int(Integer) Сумасшествие

Я пытаюсь определить, достаточно ли я умножил числитель и знаменатель сложной дроби (на 10/10), чтобы получить целые числа как сверху, так и снизу. Часто мой алгоритм работает. Однако иногда функция Int() работает не так, как ожидалось, и я получаю от нее огромные числа. Вот упрощенная версия того, что я запускаю:

<cfoutput>
    <cfset RealNumber = RandRange(1000, 10000) / 1000 />
    RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br />
    <cfloop condition="RealNumber NEQ Int(RealNumber)">
        <cfset RealNumber = RealNumber * 10 />
        RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br />
    </cfloop>
</cfoutput>

В большинстве случаев это дает то, что я хочу, но иногда это выглядит так:

RealNumber = "9.184" Int(RealNumber) = "9"
RealNumber = "91.84" Int(RealNumber) = "91"
RealNumber = "918.4" Int(RealNumber) = "918"
RealNumber = "9184" Int(RealNumber) = "9183"
RealNumber = "91840" Int(RealNumber) = "91839"
RealNumber = "918400" Int(RealNumber) = "918399"
RealNumber = "9184000" Int(RealNumber) = "9183999"
RealNumber = "91840000" Int(RealNumber) = "91839999"
RealNumber = "918400000" Int(RealNumber) = "918399999"
RealNumber = "9184000000" Int(RealNumber) = "9183999999"
RealNumber = "91840000000" Int(RealNumber) = "91839999999"
RealNumber = "918400000000" Int(RealNumber) = "918399999999"
RealNumber = "9.184E+012" Int(RealNumber) = "9.184E+012"
RealNumber = "9.184E+013" Int(RealNumber) = "9.184E+013"
RealNumber = "9.184E+014" Int(RealNumber) = "9.184E+014"
RealNumber = "9.184E+015" Int(RealNumber) = "9.184E+015"

Или даже так:

RealNumber = "2.152" Int(RealNumber) = "2"
RealNumber = "21.52" Int(RealNumber) = "21"
RealNumber = "215.2" Int(RealNumber) = "215"
RealNumber = "2152" Int(RealNumber) = "2152"
RealNumber = "21520" Int(RealNumber) = "21520"
RealNumber = "215200" Int(RealNumber) = "215200"
RealNumber = "2152000" Int(RealNumber) = "2152000"
RealNumber = "21520000" Int(RealNumber) = "21520000"
RealNumber = "215200000" Int(RealNumber) = "215200000"
RealNumber = "2152000000" Int(RealNumber) = "2152000000"
RealNumber = "21520000000" Int(RealNumber) = "21520000000"
RealNumber = "215200000000" Int(RealNumber) = "215200000000"
RealNumber = "2.152E+012" Int(RealNumber) = "2.152E+012"
RealNumber = "2.152E+013" Int(RealNumber) = "2.152E+013"
RealNumber = "2.152E+014" Int(RealNumber) = "2.152E+014"
RealNumber = "2.152E+015" Int(RealNumber) = "2.152E+015"
RealNumber = "2.152E+016" Int(RealNumber) = "2.152E+016"

Что я делаю не так и как это компенсировать?


Ответы:


1

Val(), похоже, тоже исправляет это:

<cfoutput>

    <cfset RealNumber = RandRange(1000, 10000) / 1000 />
    "#val(RealNumber)#" = INT: "#val(Int(RealNumber))#"<br />
    <cfloop condition="val(RealNumber) NEQ Val(Int(RealNumber))">
        <cfset RealNumber = RealNumber * 10 />
        "#val(RealNumber)#" INT: "#val(Int(RealNumber))#"<br />
    </cfloop>

</cfoutput>
06.02.2012
  • <cfloop condition="Val(RealNumber) NEQ Val(Int(RealNumber))"> решает проблему и получает наименьшее количество циклов. 07.02.2012
  • @Dave - я немного скептически отношусь к этому;) PrecisionEvaluate обычно приводит к гораздо меньшему количеству итераций, потому что не использует приблизительные числа, такие как 9,183999999. Таким образом, для вычисления 9.184 требуется четыре (4) итерации вместо ~ тринадцати (13) с val. Тем не менее, в целом это несущественная разница, если только вы не работаете с сотнями или тысячами чисел. 07.02.2012

  • 2

    Реальное число = "9.184E+015"

    Вывод обманчив. Если вы используете #RealNumber.toString()#, реальное значение, вероятно, будет чем-то вроде 9.183999999999998E15. CF использует приблизительный тип Double для большинства математические операции. То, что вы видите, является нормальным поведением для числа с плавающей запятой. Если вам нужна более высокая точность, используйте PrecisionEvaluate. Он использует BigDecimals для арифметических операций. (потому что они более точны, чем java.lang.Double).

    06.02.2012
  • <cfloop condition="RealNumber NEQ PrecisionEvaluate(Int(RealNumber))"> по-прежнему получает огромные цифры. 07.02.2012
  • Это потому, что вы должны использовать его для обоих значений, т.е. precisionEvaluate(RealNumber * 10). В противном случае CF возвращается к использованию чисел с плавающей запятой при выполнении математических операций. 07.02.2012

  • 3

    Попробуйте использовать javacast. ColdFusion пытается динамически определить тип вашей переменной и не очень хорошо справляется. Javacast покрывает множество грехов.

    <cfoutput>
    <cfset RealNumber = RandRange(1000, 10000) / 1000 />
    RealNumber = "#RealNumber#" Int(RealNumber) = "#Int(RealNumber)#"<br />
    <cfloop condition="RealNumber NEQ Int(RealNumber)">
        <cfset RealNumber = RealNumber * 10 />
        RealNumber = "#RealNumber#" Int(RealNumber) = "#javaCast("int", RealNumber)#"<br />
    </cfloop>
    

    06.02.2012
  • Это: <cfloop condition="RealNumber NEQ JavaCast('int', RealNumber)"> по-прежнему получает огромные числа. 07.02.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..