Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.
This repository was archived by the owner on Jan 12, 2024. It is now read-only.

Big value cause an overflow of Truncate #1139

Open
@weucode

Description

@weucode

Describe the bug

When passing a big number to Truncate, it cause an overflow because of System.Convert.ToInt64. The related code is here.

public override Func<double, long> __Body__ => (arg) => System.Convert.ToInt64(System.Math.Truncate(arg));

According to the document, if value>Int64.MaxValue, ToInt64 will throw an OverflowException, so it is suggested that add a check before conversion.

To Reproduce

The reduced test case:

namespace NameSpace {
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Intrinsic;


	@EntryPoint()
        operation main() : Unit {
            let var = 9.223372036854775296E+18;
            // 9.2233720368547752959E+18 is a safe value
            let res1 = Truncate(var);
	}
}

The origin test case:

namespace NameSpace {
    open Microsoft.Quantum.Math;
    open Microsoft.Quantum.Intrinsic;
    open Microsoft.Quantum.Convert;

	@EntryPoint()
        operation main() : Unit {
            mutable k = 36;
            let numerator = IntAsDouble(Binom(2 * k, k)) * IntAsDouble(k % 2 == 0 ? -1 | +1);
	}
}

Actual behavior

Unhandled exception. System.OverflowException: Arithmetic operation resulted in an overflow.
---> NISLNameSpace.main on D:\00Files\00QuantumFuzzing\demo1\Program.qs:line 9

Unhandled exception: System.OverflowException: Arithmetic operation resulted in an overflow.
at System.Convert.ToInt64(Double value)
at Microsoft.Quantum.Math.Truncate.Native.<>c.<get___Body__>b__2_0(Double arg)
at Microsoft.Quantum.Simulation.Core.Function2.Apply(I a) at Microsoft.Quantum.Simulation.Core.Function2.Microsoft.Quantum.Simulation.Core.ICallable<I,O>.Apply(I args)
at NISLNameSpace.main.<get___Body__>b__12_0(QVoid in) in D:\00Files\00QuantumFuzzing\demo1\Program.qs:line 9
at Microsoft.Quantum.Simulation.Core.Operation2.Apply(I a) at Microsoft.Quantum.Simulation.Core.Operation2.Apply[GenO](Object args)
at Microsoft.Quantum.Simulation.Common.SimulatorBase.Execute[T,I,O](I
args)
at Microsoft.Quantum.Simulation.Common.SimulatorBase.<>c__DisplayClass68_03.<Run>b__0() at System.Threading.Tasks.Task1.InnerInvoke()
at System.Threading.Tasks.Task.<>c.<.cctor>b__272_0(Object obj)
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback
callback, Object state)
--- End of stack trace from previous location ---
at System.Threading.ExecutionContext.RunFromThreadPoolDispatchLoop(Thread threadPoolThread, ExecutionContext executionContext, ContextCallback
callback, Object state)
at System.Threading.Tasks.Task.ExecuteWithThreadLocal(Task& currentTaskSlot, Thread threadPoolThread)
--- End of stack trace from previous location ---
at Microsoft.Quantum.EntryPointDriver.Simulation3.RunSimulator(TIn input, Func1 createSimulator)
at Microsoft.Quantum.EntryPointDriver.Simulation`3.Simulate(IEntryPoint entryPoint, TIn input, DriverSettings settings, String simulator)
at System.CommandLine.Invocation.CommandHandler.GetResultCodeAsync(Object value, InvocationContext context)
at System.CommandLine.Invocation.ModelBindingCommandHandler.InvokeAsync(InvocationContext context)
at System.CommandLine.Invocation.InvocationPipeline.<>c__DisplayClass4_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<b__20_0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass15_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass24_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass22_0.<b__0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<b__21_0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<b__19_0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<b__11_0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c.<b__10_0>d.MoveNext()
--- End of stack trace from previous location ---
at System.CommandLine.Builder.CommandLineBuilderExtensions.<>c__DisplayClass13_0.<b__0>d.MoveNext()

System information

operating system : Windows10 & Ubuntu18.04

dotnet version : 7.0.100

QDK : 0.27.258160

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingneeds triageAn initial review by a maintainer is needed

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions