You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by Stephen Mallette <sp...@gmail.com> on 2017/07/25 11:48:00 UTC
groovy, numbers and sack
Dan "The Stroke" LaRocque gave me some gory details on groovy's handling of
decimals/numbers which can make sack() do this:
gremlin> g.withSack(2).V().sack(div).by(constant(3.0)).sack()
Non-terminating decimal expansion; no exact representable decimal result.
Type ':help' or ':h' for help.
Display stack trace? [yN]y
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact
representable decimal result.
at java.math.BigDecimal.divide(BigDecimal.java:1690)
at
org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.lambda$static$45(NumberHelper.java:132)
at
org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.div(NumberHelper.java:219)
at
org.apache.tinkerpop.gremlin.process.traversal.NumberHelper.div(NumberHelper.java:214)
at
org.apache.tinkerpop.gremlin.process.traversal.Operator$4.apply(Operator.java:47)
at
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackValueStep.sideEffect(SackValueStep.java:60)
at
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectStep.processNextStart(SideEffectStep.java:39)
at
org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.hasNext(AbstractStep.java:143)
at
org.apache.tinkerpop.gremlin.process.traversal.step.util.ExpandableStepIterator.next(ExpandableStepIterator.java:50)
at
org.apache.tinkerpop.gremlin.process.traversal.step.map.MapStep.processNextStart(MapStep.java:36)
at
org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep.hasNext(AbstractStep.java:143)
at
org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal.hasNext(DefaultTraversal.java:184)
at
org.apache.tinkerpop.gremlin.console.Console$_closure3.doCall(Console.groovy:237)
at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
...
at
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(ScriptBytecodeAdapter.java:132)
at
org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuper0(ScriptBytecodeAdapter.java:152)
at
org.codehaus.groovy.tools.shell.InteractiveShellRunner.run(InteractiveShellRunner.groovy:83)
at
org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
at org.apache.tinkerpop.gremlin.console.Console.<init>(Console.groovy:169)
at
org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(IndyInterface.java:232)
at org.apache.tinkerpop.gremlin.console.Console.main(Console.groovy:478)
this does work well if the Gremlin has more explicit typing:
gremlin> g.withSack(2).V().sack(div).by(constant(3.0d)).sack()
==>0.6666666666666666
==>0.6666666666666666
==>0.6666666666666666
==>0.6666666666666666
==>0.6666666666666666
==>0.6666666666666666
gremlin> g.withSack(2d).V().sack(div).by(constant(3)).sack()
==>0.6666666666666666
==>0.6666666666666666
==>0.6666666666666666
==>0.6666666666666666
==>0.6666666666666666
==>0.6666666666666666
gremlin> g.withSack(2).V().sack(div).by(constant(3)).sack()
==>0
==>0
==>0
==>0
==>0
==>0
Is this something we can make nicer? Create a ticket?
Re: groovy, numbers and sack
Posted by Robert Dale <ro...@gmail.com>.
Yes, looks like only BigDecimal div. BigInteger doesn't take a rounding
mode and everything else appears to be done at the primitive level.
Robert Dale
On Tue, Jul 25, 2017 at 10:34 AM, Daniel Kuppitz <me...@gremlin.guru> wrote:
> Yea, using the snippet provided by Robert, this can easily be fixed in
> NumberHelper. It only affects div, right?
>
> Cheers,
> Daniel
>
>
> On Tue, Jul 25, 2017 at 3:41 PM, Marko Rodriguez <ok...@gmail.com>
> wrote:
>
> > Hi,
> >
> > Does Kuppitz’ NumberHelper come into play here?
> >
> > https://github.com/apache/tinkerpop/blob/master/gremlin-
> > core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java <
> > https://github.com/apache/tinkerpop/blob/master/gremlin-
> > core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java>
> >
> > Marko.
> >
> > http://markorodriguez.com
> >
> >
> >
> > > On Jul 25, 2017, at 6:08 AM, Robert Dale <ro...@gmail.com> wrote:
> > >
> > > I think gremlin should handle this case. It's a matter of setting the
> > > MathContext precision. I was trying to reproduce this in the shell but
> > > couldn't. Here's why and what groovy does:
> > >
> > > public Number divideImpl(Number left, Number right) {
> > > BigDecimal bigLeft = toBigDecimal(left);
> > > BigDecimal bigRight = toBigDecimal(right);
> > > try {
> > > return bigLeft.divide(bigRight);
> > > } catch (ArithmeticException e) {
> > > // set a DEFAULT precision if otherwise non-terminating
> > > int precision = Math.max(bigLeft.precision(),
> > > bigRight.precision()) + DIVISION_EXTRA_PRECISION;
> > > BigDecimal result = bigLeft.divide(bigRight, new
> > > MathContext(precision));
> > > int scale = Math.max(Math.max(bigLeft.scale(),
> > > bigRight.scale()), DIVISION_MIN_SCALE);
> > > if (result.scale() > scale) result = result.setScale(scale,
> > > BigDecimal.ROUND_HALF_UP);
> > > return result;
> > > }
> > > }
> > >
> > >
> > > Robert Dale
> > >
> > > On Tue, Jul 25, 2017 at 7:48 AM, Stephen Mallette <
> spmallette@gmail.com>
> > > wrote:
> > >
> > >> Dan "The Stroke" LaRocque gave me some gory details on groovy's
> > handling of
> > >> decimals/numbers which can make sack() do this:
> > >>
> > >> gremlin> g.withSack(2).V().sack(div).by(constant(3.0)).sack()
> > >> Non-terminating decimal expansion; no exact representable decimal
> > result.
> > >> Type ':help' or ':h' for help.
> > >> Display stack trace? [yN]y
> > >> java.lang.ArithmeticException: Non-terminating decimal expansion; no
> > exact
> > >> representable decimal result.
> > >> at java.math.BigDecimal.divide(BigDecimal.java:1690)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.
> > >> NumberHelper.lambda$static$45(NumberHelper.java:132)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.
> > >> NumberHelper.div(NumberHelper.java:219)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.
> > >> NumberHelper.div(NumberHelper.java:214)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.Operator$4.
> > >> apply(Operator.java:47)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.step.
> > >> sideEffect.SackValueStep.sideEffect(SackValueStep.java:60)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.step.
> > >> sideEffect.SideEffectStep.processNextStart(SideEffectStep.java:39)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> > >> AbstractStep.hasNext(AbstractStep.java:143)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> > >> ExpandableStepIterator.next(ExpandableStepIterator.java:50)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.step.map.
> > >> MapStep.processNextStart(MapStep.java:36)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> > >> AbstractStep.hasNext(AbstractStep.java:143)
> > >> at
> > >> org.apache.tinkerpop.gremlin.process.traversal.util.
> > >> DefaultTraversal.hasNext(DefaultTraversal.java:184)
> > >> at
> > >> org.apache.tinkerpop.gremlin.console.Console$_closure3.
> > >> doCall(Console.groovy:237)
> > >> at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
> > >> ...
> > >> at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.
> invokeMethodOnSuperN(
> > >> ScriptBytecodeAdapter.java:132)
> > >> at
> > >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.
> invokeMethodOnSuper0(
> > >> ScriptBytecodeAdapter.java:152)
> > >> at
> > >> org.codehaus.groovy.tools.shell.InteractiveShellRunner.
> > >> run(InteractiveShellRunner.groovy:83)
> > >> at
> > >> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(
> > >> IndyInterface.java:232)
> > >> at org.apache.tinkerpop.gremlin.console.Console.<init>(
> > Console.groovy:169)
> > >> at
> > >> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(
> > >> IndyInterface.java:232)
> > >> at org.apache.tinkerpop.gremlin.console.Console.main(Console.
> > groovy:478)
> > >>
> > >> this does work well if the Gremlin has more explicit typing:
> > >>
> > >> gremlin> g.withSack(2).V().sack(div).by(constant(3.0d)).sack()
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> gremlin> g.withSack(2d).V().sack(div).by(constant(3)).sack()
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> ==>0.6666666666666666
> > >> gremlin> g.withSack(2).V().sack(div).by(constant(3)).sack()
> > >> ==>0
> > >> ==>0
> > >> ==>0
> > >> ==>0
> > >> ==>0
> > >> ==>0
> > >>
> > >> Is this something we can make nicer? Create a ticket?
> > >>
> >
> >
>
Re: groovy, numbers and sack
Posted by Daniel Kuppitz <me...@gremlin.guru>.
Yea, using the snippet provided by Robert, this can easily be fixed in
NumberHelper. It only affects div, right?
Cheers,
Daniel
On Tue, Jul 25, 2017 at 3:41 PM, Marko Rodriguez <ok...@gmail.com>
wrote:
> Hi,
>
> Does Kuppitz’ NumberHelper come into play here?
>
> https://github.com/apache/tinkerpop/blob/master/gremlin-
> core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java <
> https://github.com/apache/tinkerpop/blob/master/gremlin-
> core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java>
>
> Marko.
>
> http://markorodriguez.com
>
>
>
> > On Jul 25, 2017, at 6:08 AM, Robert Dale <ro...@gmail.com> wrote:
> >
> > I think gremlin should handle this case. It's a matter of setting the
> > MathContext precision. I was trying to reproduce this in the shell but
> > couldn't. Here's why and what groovy does:
> >
> > public Number divideImpl(Number left, Number right) {
> > BigDecimal bigLeft = toBigDecimal(left);
> > BigDecimal bigRight = toBigDecimal(right);
> > try {
> > return bigLeft.divide(bigRight);
> > } catch (ArithmeticException e) {
> > // set a DEFAULT precision if otherwise non-terminating
> > int precision = Math.max(bigLeft.precision(),
> > bigRight.precision()) + DIVISION_EXTRA_PRECISION;
> > BigDecimal result = bigLeft.divide(bigRight, new
> > MathContext(precision));
> > int scale = Math.max(Math.max(bigLeft.scale(),
> > bigRight.scale()), DIVISION_MIN_SCALE);
> > if (result.scale() > scale) result = result.setScale(scale,
> > BigDecimal.ROUND_HALF_UP);
> > return result;
> > }
> > }
> >
> >
> > Robert Dale
> >
> > On Tue, Jul 25, 2017 at 7:48 AM, Stephen Mallette <sp...@gmail.com>
> > wrote:
> >
> >> Dan "The Stroke" LaRocque gave me some gory details on groovy's
> handling of
> >> decimals/numbers which can make sack() do this:
> >>
> >> gremlin> g.withSack(2).V().sack(div).by(constant(3.0)).sack()
> >> Non-terminating decimal expansion; no exact representable decimal
> result.
> >> Type ':help' or ':h' for help.
> >> Display stack trace? [yN]y
> >> java.lang.ArithmeticException: Non-terminating decimal expansion; no
> exact
> >> representable decimal result.
> >> at java.math.BigDecimal.divide(BigDecimal.java:1690)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.
> >> NumberHelper.lambda$static$45(NumberHelper.java:132)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.
> >> NumberHelper.div(NumberHelper.java:219)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.
> >> NumberHelper.div(NumberHelper.java:214)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.Operator$4.
> >> apply(Operator.java:47)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.step.
> >> sideEffect.SackValueStep.sideEffect(SackValueStep.java:60)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.step.
> >> sideEffect.SideEffectStep.processNextStart(SideEffectStep.java:39)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> >> AbstractStep.hasNext(AbstractStep.java:143)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> >> ExpandableStepIterator.next(ExpandableStepIterator.java:50)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.step.map.
> >> MapStep.processNextStart(MapStep.java:36)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> >> AbstractStep.hasNext(AbstractStep.java:143)
> >> at
> >> org.apache.tinkerpop.gremlin.process.traversal.util.
> >> DefaultTraversal.hasNext(DefaultTraversal.java:184)
> >> at
> >> org.apache.tinkerpop.gremlin.console.Console$_closure3.
> >> doCall(Console.groovy:237)
> >> at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
> >> ...
> >> at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(
> >> ScriptBytecodeAdapter.java:132)
> >> at
> >> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuper0(
> >> ScriptBytecodeAdapter.java:152)
> >> at
> >> org.codehaus.groovy.tools.shell.InteractiveShellRunner.
> >> run(InteractiveShellRunner.groovy:83)
> >> at
> >> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(
> >> IndyInterface.java:232)
> >> at org.apache.tinkerpop.gremlin.console.Console.<init>(
> Console.groovy:169)
> >> at
> >> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(
> >> IndyInterface.java:232)
> >> at org.apache.tinkerpop.gremlin.console.Console.main(Console.
> groovy:478)
> >>
> >> this does work well if the Gremlin has more explicit typing:
> >>
> >> gremlin> g.withSack(2).V().sack(div).by(constant(3.0d)).sack()
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> gremlin> g.withSack(2d).V().sack(div).by(constant(3)).sack()
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> ==>0.6666666666666666
> >> gremlin> g.withSack(2).V().sack(div).by(constant(3)).sack()
> >> ==>0
> >> ==>0
> >> ==>0
> >> ==>0
> >> ==>0
> >> ==>0
> >>
> >> Is this something we can make nicer? Create a ticket?
> >>
>
>
Re: groovy, numbers and sack
Posted by Marko Rodriguez <ok...@gmail.com>.
Hi,
Does Kuppitz’ NumberHelper come into play here?
https://github.com/apache/tinkerpop/blob/master/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java <https://github.com/apache/tinkerpop/blob/master/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/NumberHelper.java>
Marko.
http://markorodriguez.com
> On Jul 25, 2017, at 6:08 AM, Robert Dale <ro...@gmail.com> wrote:
>
> I think gremlin should handle this case. It's a matter of setting the
> MathContext precision. I was trying to reproduce this in the shell but
> couldn't. Here's why and what groovy does:
>
> public Number divideImpl(Number left, Number right) {
> BigDecimal bigLeft = toBigDecimal(left);
> BigDecimal bigRight = toBigDecimal(right);
> try {
> return bigLeft.divide(bigRight);
> } catch (ArithmeticException e) {
> // set a DEFAULT precision if otherwise non-terminating
> int precision = Math.max(bigLeft.precision(),
> bigRight.precision()) + DIVISION_EXTRA_PRECISION;
> BigDecimal result = bigLeft.divide(bigRight, new
> MathContext(precision));
> int scale = Math.max(Math.max(bigLeft.scale(),
> bigRight.scale()), DIVISION_MIN_SCALE);
> if (result.scale() > scale) result = result.setScale(scale,
> BigDecimal.ROUND_HALF_UP);
> return result;
> }
> }
>
>
> Robert Dale
>
> On Tue, Jul 25, 2017 at 7:48 AM, Stephen Mallette <sp...@gmail.com>
> wrote:
>
>> Dan "The Stroke" LaRocque gave me some gory details on groovy's handling of
>> decimals/numbers which can make sack() do this:
>>
>> gremlin> g.withSack(2).V().sack(div).by(constant(3.0)).sack()
>> Non-terminating decimal expansion; no exact representable decimal result.
>> Type ':help' or ':h' for help.
>> Display stack trace? [yN]y
>> java.lang.ArithmeticException: Non-terminating decimal expansion; no exact
>> representable decimal result.
>> at java.math.BigDecimal.divide(BigDecimal.java:1690)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.
>> NumberHelper.lambda$static$45(NumberHelper.java:132)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.
>> NumberHelper.div(NumberHelper.java:219)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.
>> NumberHelper.div(NumberHelper.java:214)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.Operator$4.
>> apply(Operator.java:47)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.step.
>> sideEffect.SackValueStep.sideEffect(SackValueStep.java:60)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.step.
>> sideEffect.SideEffectStep.processNextStart(SideEffectStep.java:39)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.step.util.
>> AbstractStep.hasNext(AbstractStep.java:143)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.step.util.
>> ExpandableStepIterator.next(ExpandableStepIterator.java:50)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.step.map.
>> MapStep.processNextStart(MapStep.java:36)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.step.util.
>> AbstractStep.hasNext(AbstractStep.java:143)
>> at
>> org.apache.tinkerpop.gremlin.process.traversal.util.
>> DefaultTraversal.hasNext(DefaultTraversal.java:184)
>> at
>> org.apache.tinkerpop.gremlin.console.Console$_closure3.
>> doCall(Console.groovy:237)
>> at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
>> ...
>> at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(
>> ScriptBytecodeAdapter.java:132)
>> at
>> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuper0(
>> ScriptBytecodeAdapter.java:152)
>> at
>> org.codehaus.groovy.tools.shell.InteractiveShellRunner.
>> run(InteractiveShellRunner.groovy:83)
>> at
>> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(
>> IndyInterface.java:232)
>> at org.apache.tinkerpop.gremlin.console.Console.<init>(Console.groovy:169)
>> at
>> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(
>> IndyInterface.java:232)
>> at org.apache.tinkerpop.gremlin.console.Console.main(Console.groovy:478)
>>
>> this does work well if the Gremlin has more explicit typing:
>>
>> gremlin> g.withSack(2).V().sack(div).by(constant(3.0d)).sack()
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> gremlin> g.withSack(2d).V().sack(div).by(constant(3)).sack()
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> ==>0.6666666666666666
>> gremlin> g.withSack(2).V().sack(div).by(constant(3)).sack()
>> ==>0
>> ==>0
>> ==>0
>> ==>0
>> ==>0
>> ==>0
>>
>> Is this something we can make nicer? Create a ticket?
>>
Re: groovy, numbers and sack
Posted by Robert Dale <ro...@gmail.com>.
I think gremlin should handle this case. It's a matter of setting the
MathContext precision. I was trying to reproduce this in the shell but
couldn't. Here's why and what groovy does:
public Number divideImpl(Number left, Number right) {
BigDecimal bigLeft = toBigDecimal(left);
BigDecimal bigRight = toBigDecimal(right);
try {
return bigLeft.divide(bigRight);
} catch (ArithmeticException e) {
// set a DEFAULT precision if otherwise non-terminating
int precision = Math.max(bigLeft.precision(),
bigRight.precision()) + DIVISION_EXTRA_PRECISION;
BigDecimal result = bigLeft.divide(bigRight, new
MathContext(precision));
int scale = Math.max(Math.max(bigLeft.scale(),
bigRight.scale()), DIVISION_MIN_SCALE);
if (result.scale() > scale) result = result.setScale(scale,
BigDecimal.ROUND_HALF_UP);
return result;
}
}
Robert Dale
On Tue, Jul 25, 2017 at 7:48 AM, Stephen Mallette <sp...@gmail.com>
wrote:
> Dan "The Stroke" LaRocque gave me some gory details on groovy's handling of
> decimals/numbers which can make sack() do this:
>
> gremlin> g.withSack(2).V().sack(div).by(constant(3.0)).sack()
> Non-terminating decimal expansion; no exact representable decimal result.
> Type ':help' or ':h' for help.
> Display stack trace? [yN]y
> java.lang.ArithmeticException: Non-terminating decimal expansion; no exact
> representable decimal result.
> at java.math.BigDecimal.divide(BigDecimal.java:1690)
> at
> org.apache.tinkerpop.gremlin.process.traversal.
> NumberHelper.lambda$static$45(NumberHelper.java:132)
> at
> org.apache.tinkerpop.gremlin.process.traversal.
> NumberHelper.div(NumberHelper.java:219)
> at
> org.apache.tinkerpop.gremlin.process.traversal.
> NumberHelper.div(NumberHelper.java:214)
> at
> org.apache.tinkerpop.gremlin.process.traversal.Operator$4.
> apply(Operator.java:47)
> at
> org.apache.tinkerpop.gremlin.process.traversal.step.
> sideEffect.SackValueStep.sideEffect(SackValueStep.java:60)
> at
> org.apache.tinkerpop.gremlin.process.traversal.step.
> sideEffect.SideEffectStep.processNextStart(SideEffectStep.java:39)
> at
> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> AbstractStep.hasNext(AbstractStep.java:143)
> at
> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> ExpandableStepIterator.next(ExpandableStepIterator.java:50)
> at
> org.apache.tinkerpop.gremlin.process.traversal.step.map.
> MapStep.processNextStart(MapStep.java:36)
> at
> org.apache.tinkerpop.gremlin.process.traversal.step.util.
> AbstractStep.hasNext(AbstractStep.java:143)
> at
> org.apache.tinkerpop.gremlin.process.traversal.util.
> DefaultTraversal.hasNext(DefaultTraversal.java:184)
> at
> org.apache.tinkerpop.gremlin.console.Console$_closure3.
> doCall(Console.groovy:237)
> at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source)
> ...
> at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuperN(
> ScriptBytecodeAdapter.java:132)
> at
> org.codehaus.groovy.runtime.ScriptBytecodeAdapter.invokeMethodOnSuper0(
> ScriptBytecodeAdapter.java:152)
> at
> org.codehaus.groovy.tools.shell.InteractiveShellRunner.
> run(InteractiveShellRunner.groovy:83)
> at
> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(
> IndyInterface.java:232)
> at org.apache.tinkerpop.gremlin.console.Console.<init>(Console.groovy:169)
> at
> org.codehaus.groovy.vmplugin.v7.IndyInterface.selectMethod(
> IndyInterface.java:232)
> at org.apache.tinkerpop.gremlin.console.Console.main(Console.groovy:478)
>
> this does work well if the Gremlin has more explicit typing:
>
> gremlin> g.withSack(2).V().sack(div).by(constant(3.0d)).sack()
> ==>0.6666666666666666
> ==>0.6666666666666666
> ==>0.6666666666666666
> ==>0.6666666666666666
> ==>0.6666666666666666
> ==>0.6666666666666666
> gremlin> g.withSack(2d).V().sack(div).by(constant(3)).sack()
> ==>0.6666666666666666
> ==>0.6666666666666666
> ==>0.6666666666666666
> ==>0.6666666666666666
> ==>0.6666666666666666
> ==>0.6666666666666666
> gremlin> g.withSack(2).V().sack(div).by(constant(3)).sack()
> ==>0
> ==>0
> ==>0
> ==>0
> ==>0
> ==>0
>
> Is this something we can make nicer? Create a ticket?
>